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