overleaf/services/web/public/coffee/spelling/SpellingMenuView.coffee
2014-02-12 10:23:40 +00:00

82 lines
2.1 KiB
CoffeeScript

define [
"libs/backbone"
"libs/mustache"
], () ->
SUGGESTIONS_TO_SHOW = 5
SpellingMenuView = Backbone.View.extend
templates:
menu: $("#spellingMenuTemplate").html()
entry: $("#spellingMenuEntryTemplate").html()
events:
"click a#learnWord": ->
@trigger "click:learn", @_currentHighlight
@hide()
initialize: (options) ->
@ide = options.ide
@ide.editor.getContainerElement().append @render().el
@ide.editor.on "click", () => @hide()
@ide.editor.on "scroll", () => @hide()
@ide.editor.on "update:doc", () => @hide()
@ide.editor.on "change:doc", () => @hide()
render: () ->
@setElement($(@templates.menu))
@$el.css "z-index" : 10000
@$(".dropdown-toggle").dropdown()
@hide()
return @
showForHighlight: (highlight) ->
if @_currentHighlight? and highlight != @_currentHighlight
@_close()
if !@_currentHighlight?
@_currentHighlight = highlight
@_setSuggestions(highlight)
position = @ide.editor.textToEditorCoordinates(
highlight.row
highlight.column + highlight.word.length
)
@_position(position.x, position.y)
@_show()
hideIfAppropriate: (cursorPosition) ->
if @_currentHighlight?
if !@_cursorCloseToHighlight(cursorPosition, @_currentHighlight) and !@_isOpen()
@hide()
hide: () ->
delete @_currentHighlight
@_close()
@$el.hide()
_setSuggestions: (highlight) ->
@$(".spelling-suggestion").remove()
divider = @$(".divider")
for suggestion in highlight.suggestions.slice(0, SUGGESTIONS_TO_SHOW)
do (suggestion) =>
entry = $(Mustache.to_html(@templates.entry, word: suggestion))
divider.before(entry)
entry.on "click", () =>
@trigger "click:suggestion", suggestion, highlight
_show: () -> @$el.show()
_isOpen: () ->
@$(".dropdown-menu").is(":visible")
_close: () ->
if @_isOpen()
@$el.dropdown("toggle")
_cursorCloseToHighlight: (position, highlight) ->
position.row == highlight.row and
position.column >= highlight.column and
position.column <= highlight.column + highlight.word.length + 1
_position: (x,y) -> @$el.css left: x, top: y