UNPKG

@qooxdoo/framework

Version:

The JS Framework for Coders

221 lines (170 loc) 5.67 kB
/* ************************************************************************ qooxdoo - the new era of web development http://qooxdoo.org Copyright: 2008 1&1 Internet AG, Germany, http://www.1und1.de License: MIT: https://opensource.org/licenses/MIT See the LICENSE file in the project's top-level directory for details. Authors: * Sebastian Werner (wpbasti) ************************************************************************ */ /** * A selection manager, which handles the selection in widgets extending * {@link qx.ui.core.scroll.AbstractScrollArea}. */ qx.Class.define("qx.ui.core.selection.ScrollArea", { extend : qx.ui.core.selection.Widget, /* ***************************************************************************** MEMBERS ***************************************************************************** */ members : { /* --------------------------------------------------------------------------- BASIC SUPPORT --------------------------------------------------------------------------- */ // overridden _isSelectable : function(item) { return this._isItemSelectable(item) && item.getLayoutParent() === this._getWidget().getChildrenContainer(); }, /* --------------------------------------------------------------------------- DIMENSION AND LOCATION --------------------------------------------------------------------------- */ // overridden _getDimension : function() { return this._getWidget().getPaneSize(); }, /* --------------------------------------------------------------------------- SCROLL SUPPORT --------------------------------------------------------------------------- */ // overridden _getScroll : function() { var widget = this._getWidget(); return { left : widget.getScrollX(), top : widget.getScrollY() }; }, // overridden _scrollBy : function(xoff, yoff) { var widget = this._getWidget(); widget.scrollByX(xoff); widget.scrollByY(yoff); }, /* --------------------------------------------------------------------------- QUERY SUPPORT --------------------------------------------------------------------------- */ // overridden _getPage : function(lead, up) { var selectables = this.getSelectables(); var length = selectables.length; var start = selectables.indexOf(lead); // Given lead is not a selectable?!? if (start === -1) { throw new Error("Invalid lead item: " + lead); } var widget = this._getWidget(); var scrollTop = widget.getScrollY(); var innerHeight = widget.getInnerSize().height; var top, bottom, found; if (up) { var min = scrollTop; var i=start; // Loop required to scroll pages up dynamically while(1) { // Iterate through all selectables from start for (; i>=0; i--) { top = widget.getItemTop(selectables[i]); // This item is out of the visible block if (top < min) { // Use previous one found = i+1; break; } } // Nothing found. Return first item. if (found == null) { var first = this._getFirstSelectable(); return first == lead ? null : first; } // Found item, but is identical to start or even before start item // Update min position and try on previous page if (found >= start) { // Reduce min by the distance of the lead item to the visible // bottom edge. This is needed instead of a simple subtraction // of the inner height to keep the last lead visible on page key // presses. This is the behavior of native toolkits as well. min -= innerHeight + scrollTop - widget.getItemBottom(lead); found = null; continue; } // Return selectable return selectables[found]; } } else { var max = innerHeight + scrollTop; var i=start; // Loop required to scroll pages down dynamically while(1) { // Iterate through all selectables from start for (; i<length; i++) { bottom = widget.getItemBottom(selectables[i]); // This item is out of the visible block if (bottom > max) { // Use previous one found = i-1; break; } } // Nothing found. Return last item. if (found == null) { var last = this._getLastSelectable(); return last == lead ? null : last; } // Found item, but is identical to start or even before start item // Update max position and try on next page if (found <= start) { // Extend max by the distance of the lead item to the visible // top edge. This is needed instead of a simple addition // of the inner height to keep the last lead visible on page key // presses. This is the behavior of native toolkits as well. max += widget.getItemTop(lead) - scrollTop; found = null; continue; } // Return selectable return selectables[found]; } } } } });