UNPKG

@qooxdoo/framework

Version:

The JS Framework for Coders

368 lines (278 loc) 7.77 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. */ qx.Class.define("qx.ui.core.selection.Widget", { extend : qx.ui.core.selection.Abstract, /* ***************************************************************************** CONSTRUCTOR ***************************************************************************** */ /** * @param widget {qx.ui.core.Widget} The widget to connect to */ construct : function(widget) { this.base(arguments); this.__widget = widget; }, /* ***************************************************************************** MEMBERS ***************************************************************************** */ members : { __widget : null, /* --------------------------------------------------------------------------- BASIC SUPPORT --------------------------------------------------------------------------- */ // overridden _isSelectable : function(item) { return this._isItemSelectable(item) && item.getLayoutParent() === this.__widget; }, // overridden _selectableToHashCode : function(item) { return item.$$hash; }, // overridden _styleSelectable : function(item, type, enabled) { enabled ? item.addState(type) : item.removeState(type); }, // overridden _capture : function() { this.__widget.capture(); }, // overridden _releaseCapture : function() { this.__widget.releaseCapture(); }, /** * Helper to return the selectability of the item concerning the * user interaction. * * @param item {qx.ui.core.Widget} The item to check. * @return {Boolean} true, if the item is selectable. */ _isItemSelectable : function(item) { if (this._userInteraction) { return item.isVisible() && item.isEnabled(); } else { return item.isVisible(); } }, /** * Returns the connected widget. * @return {qx.ui.core.Widget} The widget */ _getWidget : function() { return this.__widget; }, /* --------------------------------------------------------------------------- DIMENSION AND LOCATION --------------------------------------------------------------------------- */ // overridden _getLocation : function() { var elem = this.__widget.getContentElement().getDomElement(); return elem ? qx.bom.element.Location.get(elem) : null; }, // overridden _getDimension : function() { return this.__widget.getInnerSize(); }, // overridden _getSelectableLocationX : function(item) { var computed = item.getBounds(); if (computed) { return { left : computed.left, right : computed.left + computed.width }; } }, // overridden _getSelectableLocationY : function(item) { var computed = item.getBounds(); if (computed) { return { top : computed.top, bottom : computed.top + computed.height }; } }, /* --------------------------------------------------------------------------- SCROLL SUPPORT --------------------------------------------------------------------------- */ // overridden _getScroll : function() { return { left : 0, top : 0 }; }, // overridden _scrollBy : function(xoff, yoff) { // empty implementation }, // overridden _scrollItemIntoView : function(item) { this.__widget.scrollChildIntoView(item); }, /* --------------------------------------------------------------------------- QUERY SUPPORT --------------------------------------------------------------------------- */ // overridden getSelectables : function(all) { // if only the user selectables should be returned var oldUserInteraction = false; if (!all) { oldUserInteraction = this._userInteraction; this._userInteraction = true; } var children = this.__widget.getChildren(); var result = []; var child; for (var i=0, l=children.length; i<l; i++) { child = children[i]; if (this._isItemSelectable(child)) { result.push(child); } } // reset to the former user interaction state this._userInteraction = oldUserInteraction; return result; }, // overridden _getSelectableRange : function(item1, item2) { // Fast path for identical items if (item1 === item2) { return [item1]; } // Iterate over children and collect all items // between the given two (including them) var children = this.__widget.getChildren(); var result = []; var active = false; var child; for (var i=0, l=children.length; i<l; i++) { child = children[i]; if (child === item1 || child === item2) { if (active) { result.push(child); break; } else { active = true; } } if (active && this._isItemSelectable(child)) { result.push(child); } } return result; }, // overridden _getFirstSelectable : function() { var children = this.__widget.getChildren(); for (var i=0, l=children.length; i<l; i++) { if (this._isItemSelectable(children[i])) { return children[i]; } } return null; }, // overridden _getLastSelectable : function() { var children = this.__widget.getChildren(); for (var i=children.length-1; i>0; i--) { if (this._isItemSelectable(children[i])) { return children[i]; } } return null; }, // overridden _getRelatedSelectable : function(item, relation) { var vertical = this.__widget.getOrientation() === "vertical"; var children = this.__widget.getChildren(); var index = children.indexOf(item); var sibling; if ((vertical && relation === "above") || (!vertical && relation === "left")) { for (var i=index-1; i>=0; i--) { sibling = children[i]; if (this._isItemSelectable(sibling)) { return sibling; } } } else if ((vertical && relation === "under") || (!vertical && relation === "right")) { for (var i=index+1; i<children.length; i++) { sibling = children[i]; if (this._isItemSelectable(sibling)) { return sibling; } } } return null; }, // overridden _getPage : function(lead, up) { if (up) { return this._getFirstSelectable(); } else { return this._getLastSelectable(); } } }, /* ***************************************************************************** DESTRUCTOR ***************************************************************************** */ destruct : function() { this.__widget = null; } });