5 constructor: (tree_widget) ->
6 @tree_widget = tree_widget
8 @is_initialized = false
11 getParentWithOverflow = =>
12 css_values = ['overflow', 'overflow-y']
15 for css_value in css_values
16 if $.css(el, css_value) in ['auto', 'scroll']
21 if hasOverFlow(@tree_widget.$el[0])
22 return @tree_widget.$el
24 for el in @tree_widget.$el.parents()
30 setDocumentAsScrollParent = =>
31 @scroll_parent_top = 0
32 @$scroll_parent = null
34 if @tree_widget.$el.css('position') == 'fixed'
35 setDocumentAsScrollParent()
37 $scroll_parent = getParentWithOverflow()
39 if $scroll_parent and $scroll_parent.length and $scroll_parent[0].tagName != 'HTML'
40 @$scroll_parent = $scroll_parent
41 @scroll_parent_top = @$scroll_parent.offset().top
43 setDocumentAsScrollParent()
45 @is_initialized = true
48 if not @is_initialized
54 hovered_area = @tree_widget.dnd_handler.hovered_area
56 if hovered_area and hovered_area.top != @previous_top
57 @previous_top = hovered_area.top
60 @_handleScrollingWithScrollParent(hovered_area)
62 @_handleScrollingWithDocument(hovered_area)
64 _handleScrollingWithScrollParent: (area) ->
65 distance_bottom = @scroll_parent_top + @$scroll_parent[0].offsetHeight - area.bottom
67 if distance_bottom < 20
68 @$scroll_parent[0].scrollTop += 20
69 @tree_widget.refreshHitAreas()
71 else if (area.top - @scroll_parent_top) < 20
72 @$scroll_parent[0].scrollTop -= 20
73 @tree_widget.refreshHitAreas()
76 _handleScrollingWithDocument: (area) ->
77 distance_top = area.top - $(document).scrollTop()
80 $(document).scrollTop($(document).scrollTop() - 20)
81 else if $(window).height() - (area.bottom - $(document).scrollTop()) < 20
82 $(document).scrollTop($(document).scrollTop() + 20)
88 @$scroll_parent[0].scrollTop = top
90 tree_top = @tree_widget.$el.offset().top
91 $(document).scrollTop(top + tree_top)
93 isScrolledIntoView: (element) ->
100 view_bottom = @$scroll_parent.height()
102 element_top = $element.offset().top - @scroll_parent_top
103 element_bottom = element_top + $element.height()
105 view_top = $(window).scrollTop()
106 view_bottom = view_top + $(window).height()
108 element_top = $element.offset().top
109 element_bottom = element_top + $element.height()
111 return (element_bottom <= view_bottom) and (element_top >= view_top)
114 module.exports = ScrollHandler