124 lines · 3.3 KB · Text
RawDownload
class app.views.ListFocus extends app.View  @activeClass: 'focus'   @events:    click: 'onClick'   @shortcuts:    up:         'onUp'    down:       'onDown'    left:       'onLeft'    enter:      'onEnter'    superEnter: 'onSuperEnter'    escape:     'blur'   constructor: (@el) ->    super    @focusOnNextFrame = $.framify(@focus, @)   focus: (el, options = {}) ->    if el and not el.classList.contains @constructor.activeClass      @blur()      el.classList.add @constructor.activeClass      $.trigger el, 'focus' unless options.silent is true    return   blur: =>    if cursor = @getCursor()      cursor.classList.remove @constructor.activeClass      $.trigger cursor, 'blur'    return   getCursor: ->    @findByClass(@constructor.activeClass) or @findByClass(app.views.ListSelect.activeClass)   findNext: (cursor) ->    if next = cursor.nextSibling      if next.tagName is 'A'        next      else if next.tagName is 'SPAN' # pagination link        $.click(next)        @findNext cursor      else if next.tagName is 'DIV' # sub-list        if cursor.className.indexOf(' open') >= 0          @findFirst(next) or @findNext(next)        else          @findNext(next)      else if next.tagName is 'H6' # title        @findNext(next)    else if cursor.parentNode isnt @el      @findNext cursor.parentNode   findFirst: (cursor) ->    return unless first = cursor.firstChild     if first.tagName is 'A'      first    else if first.tagName is 'SPAN' # pagination link      $.click(first)      @findFirst cursor   findPrev: (cursor) ->    if prev = cursor.previousSibling      if prev.tagName is 'A'        prev      else if prev.tagName is 'SPAN' # pagination link        $.click(prev)        @findPrev cursor      else if prev.tagName is 'DIV' # sub-list        if prev.previousSibling.className.indexOf('open') >= 0          @findLast(prev) or @findPrev(prev)        else          @findPrev(prev)      else if prev.tagName is 'H6' # title        @findPrev(prev)    else if cursor.parentNode isnt @el      @findPrev cursor.parentNode   findLast: (cursor) ->    return unless last = cursor.lastChild     if last.tagName is 'A'      last    else if last.tagName is 'SPAN' or last.tagName is 'H6' # pagination link or title      @findPrev last    else if last.tagName is 'DIV' # sub-list      @findLast last   onDown: =>    if cursor = @getCursor()      @focusOnNextFrame @findNext(cursor)    else      @focusOnNextFrame @findByTag('a')    return   onUp: =>    if cursor = @getCursor()      @focusOnNextFrame @findPrev(cursor)    else      @focusOnNextFrame @findLastByTag('a')    return   onLeft: =>    cursor = @getCursor()    if cursor and not cursor.classList.contains(app.views.ListFold.activeClass) and cursor.parentNode isnt @el      prev = cursor.parentNode.previousSibling      @focusOnNextFrame cursor.parentNode.previousSibling if prev and prev.classList.contains(app.views.ListFold.targetClass)    return   onEnter: =>    if cursor = @getCursor()      $.click(cursor)    return   onSuperEnter: =>    if cursor = @getCursor()      $.popup(cursor)    return   onClick: (event) =>    return if event.which isnt 1 or event.metaKey or event.ctrlKey    target = $.eventTarget(event)    if target.tagName is 'A'      @focus target, silent: true    return