AutorÃa | Ultima modificación | Ver Log |
YUI.add('widget-child', function (Y, NAME) {/*** Extension enabling a Widget to be a child of another Widget.** @module widget-child*/var Lang = Y.Lang;/*** Widget extension providing functionality enabling a Widget to be a* child of another Widget.** @class WidgetChild* @param {Object} config User configuration object.*/function Child() {// Widget method overlapY.after(this._syncUIChild, this, "syncUI");Y.after(this._bindUIChild, this, "bindUI");}Child.ATTRS = {/*** @attribute selected* @type Number* @default 0** @description Number indicating if the Widget is selected. Possible* values are:* <dl>* <dt>0</dt> <dd>(Default) Not selected</dd>* <dt>1</dt> <dd>Fully selected</dd>* <dt>2</dt> <dd>Partially selected</dd>* </dl>*/selected: {value: 0,validator: Lang.isNumber},/*** @attribute index* @type Number* @readOnly** @description Number representing the Widget's ordinal position in its* parent Widget.*/index: {readOnly: true,getter: function () {var parent = this.get("parent"),index = -1;if (parent) {index = parent.indexOf(this);}return index;}},/*** @attribute parent* @type Widget* @readOnly** @description Retrieves the parent of the Widget in the object hierarchy.*/parent: {readOnly: true},/*** @attribute depth* @type Number* @default -1* @readOnly** @description Number representing the depth of this Widget relative to* the root Widget in the object heirarchy.*/depth: {readOnly: true,getter: function () {var parent = this.get("parent"),root = this.get("root"),depth = -1;while (parent) {depth = (depth + 1);if (parent == root) {break;}parent = parent.get("parent");}return depth;}},/*** @attribute root* @type Widget* @readOnly** @description Returns the root Widget in the object hierarchy. If the* ROOT_TYPE property is set, the search for the root Widget will be* constrained to parent Widgets of the specified type.*/root: {readOnly: true,getter: function () {var getParent = function (child) {var parent = child.get("parent"),FnRootType = child.ROOT_TYPE,criteria = parent;if (FnRootType) {criteria = (parent && Y.instanceOf(parent, FnRootType));}return (criteria ? getParent(parent) : child);};return getParent(this);}}};Child.prototype = {/*** Constructor reference used to determine the root of a Widget-based* object tree.* <p>* Currently used to control the behavior of the <code>root</code>* attribute so that recursing up the object heirarchy can be constrained* to a specific type of Widget. Widget authors should set this property* to the constructor function for a given Widget implementation.* </p>** @property ROOT_TYPE* @type Object*/ROOT_TYPE: null,/*** Returns the node on which to bind delegate listeners.** Override of Widget's implementation of _getUIEventNode() to ensure that* all event listeners are bound to the Widget's topmost DOM element.* This ensures that the firing of each type of Widget UI event (click,* mousedown, etc.) is facilitated by a single, top-level, delegated DOM* event listener.** @method _getUIEventNode* @for Widget* @protected*/_getUIEventNode: function () {var root = this.get("root"),returnVal;if (root) {returnVal = root.get("boundingBox");}return returnVal;},/*** @method next* @description Returns the Widget's next sibling.* @param {Boolean} circular Boolean indicating if the parent's first child* should be returned if the child has no next sibling.* @return {Widget} Widget instance.*/next: function (circular) {var parent = this.get("parent"),sibling;if (parent) {sibling = parent.item((this.get("index")+1));}if (!sibling && circular) {sibling = parent.item(0);}return sibling;},/*** @method previous* @description Returns the Widget's previous sibling.* @param {Boolean} circular Boolean indicating if the parent's last child* should be returned if the child has no previous sibling.* @return {Widget} Widget instance.*/previous: function (circular) {var parent = this.get("parent"),index = this.get("index"),sibling;if (parent && index > 0) {sibling = parent.item([(index-1)]);}if (!sibling && circular) {sibling = parent.item((parent.size() - 1));}return sibling;},// Override of Y.WidgetParent.remove()// Sugar implementation allowing a child to remove itself from its parent.remove: function (index) {var parent,removed;if (Lang.isNumber(index)) {removed = Y.WidgetParent.prototype.remove.apply(this, arguments);}else {parent = this.get("parent");if (parent) {removed = parent.remove(this.get("index"));}}return removed;},/*** @method isRoot* @description Determines if the Widget is the root Widget in the* object hierarchy.* @return {Boolean} Boolean indicating if Widget is the root Widget in the* object hierarchy.*/isRoot: function () {return (this == this.get("root"));},/*** @method ancestor* @description Returns the Widget instance at the specified depth.* @param {number} depth Number representing the depth of the ancestor.* @return {Widget} Widget instance.*/ancestor: function (depth) {var root = this.get("root"),parent;if (this.get("depth") > depth) {parent = this.get("parent");while (parent != root && parent.get("depth") > depth) {parent = parent.get("parent");}}return parent;},/*** Updates the UI to reflect the <code>selected</code> attribute value.** @method _uiSetChildSelected* @protected* @param {number} selected The selected value to be reflected in the UI.*/_uiSetChildSelected: function (selected) {var box = this.get("boundingBox"),sClassName = this.getClassName("selected");if (selected === 0) {box.removeClass(sClassName);}else {box.addClass(sClassName);}},/*** Default attribute change listener for the <code>selected</code>* attribute, responsible for updating the UI, in response to* attribute changes.** @method _afterChildSelectedChange* @protected* @param {EventFacade} event The event facade for the attribute change.*/_afterChildSelectedChange: function (event) {this._uiSetChildSelected(event.newVal);},/*** Synchronizes the UI to match the WidgetChild state.* <p>* This method is invoked after bindUI is invoked for the Widget class* using YUI's aop infrastructure.* </p>** @method _syncUIChild* @protected*/_syncUIChild: function () {this._uiSetChildSelected(this.get("selected"));},/*** Binds event listeners responsible for updating the UI state in response* to WidgetChild related state changes.* <p>* This method is invoked after bindUI is invoked for the Widget class* using YUI's aop infrastructure.* </p>* @method _bindUIChild* @protected*/_bindUIChild: function () {this.after("selectedChange", this._afterChildSelectedChange);}};Y.WidgetChild = Child;}, '3.18.1', {"requires": ["base-build", "widget"]});