1 /**
  2  * @fileOverview drag extension for position
  3  * @author yiminghe@gmail.com
  4  */
  5 KISSY.add("component/uibase/drag", function (S) {
  6 
  7     /**
  8      * @name Drag
  9      * @class
 10      * Drag extension class.
 11      * Make element draggable.
 12      * @memberOf Component.UIBase
 13      */
 14     function Drag() {
 15     }
 16 
 17     Drag.ATTRS =
 18 
 19     /**
 20      * @lends Component.UIBase.Drag
 21      */
 22     {
 23         /**
 24          * Current draggable element's handlers.
 25          * See {@link DD.Draggable#handlers}
 26          */
 27         handlers:{
 28             value:[]
 29         },
 30         /**
 31          * Whether current element is draggable.
 32          * @type Boolean
 33          */
 34         draggable:{value:true}
 35     };
 36 
 37     function dragExtAction(ev) {
 38         this.set("xy", [ev.left, ev.top]);
 39     }
 40 
 41     Drag.prototype = {
 42 
 43         _uiSetHandlers:function (v) {
 44             var d;
 45             if (v && v.length > 0 && (d = this.__drag)) {
 46                 d.set("handlers", v);
 47             }
 48         },
 49 
 50         __bindUI:function () {
 51             var DD = S.require("dd") || {},
 52                 Draggable = DD.Draggable,
 53                 d,
 54                 self = this,
 55                 dragCfg = self.get("draggable"),
 56                 el = self.get("el");
 57             if (dragCfg && Draggable) {
 58                 if (dragCfg === true) {
 59                     dragCfg = {};
 60                 }
 61                 d = self.__drag = new Draggable({
 62                     node:el,
 63                     move:dragCfg.proxy
 64                 });
 65 
 66                 if (dragCfg.proxy) {
 67                     dragCfg.proxy.moveOnEnd = false;
 68                     d.on("dragend", function () {
 69                         var proxyOffset = p.get("proxyNode").offset();
 70                         el.css("visibility", "");
 71                         self.set("x", proxyOffset.left);
 72                         self.set("y", proxyOffset.top);
 73                     });
 74                     var p = self.__proxy = new DD.Proxy(dragCfg.proxy);
 75                     p.attachDrag(d);
 76                 } else {
 77                     d.on("drag", dragExtAction, self);
 78                 }
 79 
 80                 if (dragCfg.scroll) {
 81                     var s = self.__scroll = new DD.Scroll(dragCfg.scroll);
 82                     s.attachDrag(d);
 83                 }
 84 
 85             }
 86         },
 87 
 88         _uiSetDraggable:function (v) {
 89             var d = this.__drag;
 90             d && d.set("disabled", !v);
 91         },
 92 
 93         __destructor:function () {
 94             var self = this,
 95                 p = self.__proxy,
 96                 s = self.__scroll,
 97                 d = self.__drag;
 98             d && d.destroy();
 99             s && s.destroy();
100             p && p.destroy();
101         }
102 
103     };
104     return Drag;
105 
106 });