Index: client/touch/InfiniteScroller.dart |
=================================================================== |
--- client/touch/InfiniteScroller.dart (revision 4144) |
+++ client/touch/InfiniteScroller.dart (working copy) |
@@ -1,145 +0,0 @@ |
-// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-/** |
- * Adds a listener to the scroller with triggers events |
- * when a trigger point at the top, or bottom, of the screen is reached. |
- * |
- * To use this you will need to have an element with a scroller attached |
- * to it. You need to have defined (in pixels) how far from the top or |
- * bottom the scroll position must be in order to trigger (the "trigger |
- * point") The element using this must have functions for hitting the top |
- * trigger, and the bottom trigger. In general, these methods will |
- * ascertain whether we have more data to scroll to (i.e. when we hit |
- * the bottom trigger point but have reached the end of the data |
- * displayed in the element we should ignore it), make the call for |
- * more data and reposition the scroller - repositioning is key to |
- * good user experience. |
- * |
- * Triggers are generated by listening for the SCROLL_END event from the |
- * scroller, so data calls are not initiated whilst scrolling is happening, |
- * but after. |
- * |
- * Controls changing divs between the usual (non-loading) div and the |
- * loading div. To take advantage of this, callback function should return |
- * a boolean indicating whether the usual div should be replaced by the |
- * loading div. |
- */ |
-class InfiniteScroller { |
- Scroller _scroller; |
- |
- /** |
- * Function to invoke when trigger point is reached at the top of the view. |
- */ |
- Function _onTopScroll; |
- |
- /** |
- * Function to invoke when trigger point is reached at the bottom of the view. |
- */ |
- Function _onBottomScroll; |
- |
- /** Offset for trigger point at the top of the view. */ |
- double _offsetTop; |
- |
- /** Offset for trigger point at the bottom of the view. */ |
- double _offsetBottom; |
- |
- /** Saves the last Y position. */ |
- double _lastScrollY; |
- Element _topDiv; |
- Element _topLoadingDiv; |
- Element _bottomDiv; |
- Element _bottomLoadingDiv; |
- |
- InfiniteScroller(Scroller scroller, |
- Function onTopScroll, Function onBottomScroll, |
- double offsetTop, [double offsetBottom = null]) |
- : _scroller = scroller, |
- _onTopScroll = onTopScroll, |
- _onBottomScroll = onBottomScroll, |
- _offsetTop = offsetTop, |
- _offsetBottom = offsetBottom == null ? offsetTop : offsetBottom, |
- _lastScrollY = 0.0 { |
- } |
- |
- /** |
- * Adds the loading divs. |
- * [topDiv] The div usually shown at the top. |
- * [topLoadingDiv] is the div to show at the top when waiting for more |
- * content to load at the top of the page. |
- * [bottomDiv] is the div usually shown at the bottom. |
- * [bottomLoadingDiv] is the div to show at the bottom when waiting for more |
- * content to load at the end of the page. |
- */ |
- void addLoadingDivs([Element topDiv = null, |
- Element topLoadingDiv = null, |
- Element bottomDiv = null, |
- Element bottomLoadingDiv = null]) { |
- _topDiv = topDiv; |
- _topLoadingDiv = topLoadingDiv; |
- _bottomDiv = bottomDiv; |
- _bottomLoadingDiv = bottomLoadingDiv; |
- _updateVisibility(false, _topDiv, _topLoadingDiv); |
- _updateVisibility(false, _bottomDiv, _bottomLoadingDiv); |
- } |
- |
- void initialize() { |
- _registerEventListeners(); |
- } |
- |
- /** |
- * Switch back the divs after loading complete. Delegate should call |
- * this function after loading is complete. |
- */ |
- void loadEnd() { |
- _updateVisibility(false, _topDiv, _topLoadingDiv); |
- _updateVisibility(false, _bottomDiv, _bottomLoadingDiv); |
- } |
- |
- /** |
- * Called at the end of a scroll event. |
- */ |
- void _onScrollEnd() { |
- double ypos = _scroller.getVerticalOffset(); |
- |
- // Scroll is below last point. |
- if (ypos < _lastScrollY) { |
- double bottomTrigger = _scroller.getMinPointY() + _offsetBottom; |
- // And below trigger point. |
- if (ypos <= bottomTrigger) { |
- _updateVisibility(_onBottomScroll(), _bottomDiv, _bottomLoadingDiv); |
- } |
- } else { |
- if (ypos > _lastScrollY) { |
- // Scroll is above last point. |
- double topTrigger = _scroller.getMaxPointY() - _offsetTop; |
- // And above trigger point. |
- if (ypos >= topTrigger) { |
- _updateVisibility(_onTopScroll(), _topDiv, _topLoadingDiv); |
- } |
- } |
- } |
- _lastScrollY = ypos; |
- } |
- |
- /** |
- * Register the event listeners. |
- */ |
- void _registerEventListeners() { |
- _scroller.onScrollerEnd.add((Event event) { _onScrollEnd(); }); |
- } |
- |
- /** |
- * Hides one div and shows another. |
- */ |
- void _updateVisibility(bool isLoading, Element element, |
- Element loadingElement) { |
- if (element != null) { |
- element.style.display = isLoading ? "none" : ""; |
- } |
- if (loadingElement != null) { |
- loadingElement.style.display = isLoading ? "" : "none"; |
- } |
- } |
-} |