[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/lib/yuilib/3.17.2/widget-child/ -> widget-child-debug.js (source)

   1  /*
   2  YUI 3.17.2 (build 9c3c78e)
   3  Copyright 2014 Yahoo! Inc. All rights reserved.
   4  Licensed under the BSD License.
   5  http://yuilibrary.com/license/
   6  */
   7  
   8  YUI.add('widget-child', function (Y, NAME) {
   9  
  10  /**
  11   * Extension enabling a Widget to be a child of another Widget.
  12   *
  13   * @module widget-child
  14   */
  15  
  16  var Lang = Y.Lang;
  17  
  18  /**
  19   * Widget extension providing functionality enabling a Widget to be a
  20   * child of another Widget.
  21   *
  22   * @class WidgetChild
  23   * @param {Object} config User configuration object.
  24  */
  25  function Child() {
  26  
  27      //  Widget method overlap
  28      Y.after(this._syncUIChild, this, "syncUI");
  29      Y.after(this._bindUIChild, this, "bindUI");
  30  
  31  }
  32  
  33  Child.ATTRS = {
  34  
  35      /**
  36       * @attribute selected
  37       * @type Number
  38       * @default 0
  39       *
  40       * @description Number indicating if the Widget is selected.  Possible
  41       * values are:
  42       * <dl>
  43       * <dt>0</dt> <dd>(Default) Not selected</dd>
  44       * <dt>1</dt> <dd>Fully selected</dd>
  45       * <dt>2</dt> <dd>Partially selected</dd>
  46       * </dl>
  47      */
  48      selected: {
  49          value: 0,
  50          validator: Lang.isNumber
  51      },
  52  
  53  
  54      /**
  55       * @attribute index
  56       * @type Number
  57       * @readOnly
  58       *
  59       * @description Number representing the Widget's ordinal position in its
  60       * parent Widget.
  61       */
  62      index: {
  63          readOnly: true,
  64          getter: function () {
  65  
  66              var parent = this.get("parent"),
  67                  index = -1;
  68  
  69              if (parent) {
  70                  index = parent.indexOf(this);
  71              }
  72  
  73              return index;
  74  
  75          }
  76      },
  77  
  78  
  79      /**
  80       * @attribute parent
  81       * @type Widget
  82       * @readOnly
  83       *
  84       * @description Retrieves the parent of the Widget in the object hierarchy.
  85      */
  86      parent: {
  87          readOnly: true
  88      },
  89  
  90  
  91      /**
  92       * @attribute depth
  93       * @type Number
  94       * @default -1
  95       * @readOnly
  96       *
  97       * @description Number representing the depth of this Widget relative to
  98       * the root Widget in the object heirarchy.
  99       */
 100      depth: {
 101          readOnly: true,
 102          getter: function () {
 103  
 104              var parent = this.get("parent"),
 105                  root = this.get("root"),
 106                  depth = -1;
 107  
 108              while (parent) {
 109  
 110                  depth = (depth + 1);
 111  
 112                  if (parent == root) {
 113                      break;
 114                  }
 115  
 116                  parent = parent.get("parent");
 117  
 118              }
 119  
 120              return depth;
 121  
 122          }
 123      },
 124  
 125      /**
 126       * @attribute root
 127       * @type Widget
 128       * @readOnly
 129       *
 130       * @description Returns the root Widget in the object hierarchy.  If the
 131       * ROOT_TYPE property is set, the search for the root Widget will be
 132       * constrained to parent Widgets of the specified type.
 133       */
 134      root: {
 135          readOnly: true,
 136          getter: function () {
 137  
 138              var getParent = function (child) {
 139  
 140                  var parent = child.get("parent"),
 141                      FnRootType = child.ROOT_TYPE,
 142                      criteria = parent;
 143  
 144                  if (FnRootType) {
 145                      criteria = (parent && Y.instanceOf(parent, FnRootType));
 146                  }
 147  
 148                  return (criteria ? getParent(parent) : child);
 149  
 150              };
 151  
 152              return getParent(this);
 153  
 154          }
 155      }
 156  
 157  };
 158  
 159  Child.prototype = {
 160  
 161      /**
 162       * Constructor reference used to determine the root of a Widget-based
 163       * object tree.
 164       * <p>
 165       * Currently used to control the behavior of the <code>root</code>
 166       * attribute so that recursing up the object heirarchy can be constrained
 167       * to a specific type of Widget.  Widget authors should set this property
 168       * to the constructor function for a given Widget implementation.
 169       * </p>
 170       *
 171       * @property ROOT_TYPE
 172       * @type Object
 173       */
 174      ROOT_TYPE: null,
 175  
 176      /**
 177       * Returns the node on which to bind delegate listeners.
 178       *
 179       * Override of Widget's implementation of _getUIEventNode() to ensure that
 180       * all event listeners are bound to the Widget's topmost DOM element.
 181       * This ensures that the firing of each type of Widget UI event (click,
 182       * mousedown, etc.) is facilitated by a single, top-level, delegated DOM
 183       * event listener.
 184       *
 185       * @method _getUIEventNode
 186       * @for Widget
 187       * @protected
 188       */
 189      _getUIEventNode: function () {
 190          var root = this.get("root"),
 191              returnVal;
 192  
 193          if (root) {
 194              returnVal = root.get("boundingBox");
 195          }
 196  
 197          return returnVal;
 198      },
 199  
 200      /**
 201      * @method next
 202      * @description Returns the Widget's next sibling.
 203      * @param {Boolean} circular Boolean indicating if the parent's first child
 204      * should be returned if the child has no next sibling.
 205      * @return {Widget} Widget instance.
 206      */
 207      next: function (circular) {
 208  
 209          var parent = this.get("parent"),
 210              sibling;
 211  
 212          if (parent) {
 213              sibling = parent.item((this.get("index")+1));
 214          }
 215  
 216          if (!sibling && circular) {
 217              sibling = parent.item(0);
 218          }
 219  
 220          return sibling;
 221  
 222      },
 223  
 224  
 225      /**
 226      * @method previous
 227      * @description Returns the Widget's previous sibling.
 228      * @param {Boolean} circular Boolean indicating if the parent's last child
 229      * should be returned if the child has no previous sibling.
 230      * @return {Widget} Widget instance.
 231      */
 232      previous: function (circular) {
 233  
 234          var parent = this.get("parent"),
 235              index = this.get("index"),
 236              sibling;
 237  
 238          if (parent && index > 0) {
 239              sibling = parent.item([(index-1)]);
 240          }
 241  
 242          if (!sibling && circular) {
 243              sibling = parent.item((parent.size() - 1));
 244          }
 245  
 246          return sibling;
 247  
 248      },
 249  
 250  
 251      //  Override of Y.WidgetParent.remove()
 252      //  Sugar implementation allowing a child to remove itself from its parent.
 253      remove: function (index) {
 254  
 255          var parent,
 256              removed;
 257  
 258          if (Lang.isNumber(index)) {
 259              removed = Y.WidgetParent.prototype.remove.apply(this, arguments);
 260          }
 261          else {
 262  
 263              parent = this.get("parent");
 264  
 265              if (parent) {
 266                  removed = parent.remove(this.get("index"));
 267              }
 268  
 269          }
 270  
 271          return removed;
 272  
 273      },
 274  
 275  
 276      /**
 277      * @method isRoot
 278      * @description Determines if the Widget is the root Widget in the
 279      * object hierarchy.
 280      * @return {Boolean} Boolean indicating if Widget is the root Widget in the
 281      * object hierarchy.
 282      */
 283      isRoot: function () {
 284          return (this == this.get("root"));
 285      },
 286  
 287  
 288      /**
 289      * @method ancestor
 290      * @description Returns the Widget instance at the specified depth.
 291      * @param {number} depth Number representing the depth of the ancestor.
 292      * @return {Widget} Widget instance.
 293      */
 294      ancestor: function (depth) {
 295  
 296          var root = this.get("root"),
 297              parent;
 298  
 299          if (this.get("depth") > depth)  {
 300  
 301              parent = this.get("parent");
 302  
 303              while (parent != root && parent.get("depth") > depth) {
 304                  parent = parent.get("parent");
 305              }
 306  
 307          }
 308  
 309          return parent;
 310  
 311      },
 312  
 313  
 314      /**
 315       * Updates the UI to reflect the <code>selected</code> attribute value.
 316       *
 317       * @method _uiSetChildSelected
 318       * @protected
 319       * @param {number} selected The selected value to be reflected in the UI.
 320       */
 321      _uiSetChildSelected: function (selected) {
 322  
 323          var box = this.get("boundingBox"),
 324              sClassName = this.getClassName("selected");
 325  
 326          if (selected === 0) {
 327              box.removeClass(sClassName);
 328          }
 329          else {
 330              box.addClass(sClassName);
 331          }
 332  
 333      },
 334  
 335  
 336      /**
 337       * Default attribute change listener for the <code>selected</code>
 338       * attribute, responsible for updating the UI, in response to
 339       * attribute changes.
 340       *
 341       * @method _afterChildSelectedChange
 342       * @protected
 343       * @param {EventFacade} event The event facade for the attribute change.
 344       */
 345      _afterChildSelectedChange: function (event) {
 346          this._uiSetChildSelected(event.newVal);
 347      },
 348  
 349  
 350      /**
 351       * Synchronizes the UI to match the WidgetChild state.
 352       * <p>
 353       * This method is invoked after bindUI is invoked for the Widget class
 354       * using YUI's aop infrastructure.
 355       * </p>
 356       *
 357       * @method _syncUIChild
 358       * @protected
 359       */
 360      _syncUIChild: function () {
 361          this._uiSetChildSelected(this.get("selected"));
 362      },
 363  
 364  
 365      /**
 366       * Binds event listeners responsible for updating the UI state in response
 367       * to WidgetChild related state changes.
 368       * <p>
 369       * This method is invoked after bindUI is invoked for the Widget class
 370       * using YUI's aop infrastructure.
 371       * </p>
 372       * @method _bindUIChild
 373       * @protected
 374       */
 375      _bindUIChild: function () {
 376          this.after("selectedChange", this._afterChildSelectedChange);
 377      }
 378  
 379  };
 380  
 381  Y.WidgetChild = Child;
 382  
 383  
 384  }, '3.17.2', {"requires": ["base-build", "widget"]});


Generated: Thu Aug 11 10:00:09 2016 Cross-referenced by PHPXref 0.7.1