--- /dev/null
+<html>\r
+<head>\r
+ <title>The source code</title>\r
+ <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />\r
+ <script type="text/javascript" src="../resources/prettify/prettify.js"></script>\r
+</head>\r
+<body onload="prettyPrint();">\r
+ <pre class="prettyprint lang-js"><div id="cls-Ext.dd.DragSource"></div>/**\r
+ * @class Ext.dd.DragSource\r
+ * @extends Ext.dd.DDProxy\r
+ * A simple class that provides the basic implementation needed to make any element draggable.\r
+ * @constructor\r
+ * @param {Mixed} el The container element\r
+ * @param {Object} config\r
+ */\r
+Ext.dd.DragSource = function(el, config){\r
+ this.el = Ext.get(el);\r
+ if(!this.dragData){\r
+ this.dragData = {};\r
+ }\r
+ \r
+ Ext.apply(this, config);\r
+ \r
+ if(!this.proxy){\r
+ this.proxy = new Ext.dd.StatusProxy();\r
+ }\r
+ Ext.dd.DragSource.superclass.constructor.call(this, this.el.dom, this.ddGroup || this.group, \r
+ {dragElId : this.proxy.id, resizeFrame: false, isTarget: false, scroll: this.scroll === true});\r
+ \r
+ this.dragging = false;\r
+};\r
+\r
+Ext.extend(Ext.dd.DragSource, Ext.dd.DDProxy, {\r
+ <div id="cfg-Ext.dd.DragSource-ddGroup"></div>/**\r
+ * @cfg {String} ddGroup\r
+ * A named drag drop group to which this object belongs. If a group is specified, then this object will only\r
+ * interact with other drag drop objects in the same group (defaults to undefined).\r
+ */\r
+ <div id="cfg-Ext.dd.DragSource-dropAllowed"></div>/**\r
+ * @cfg {String} dropAllowed\r
+ * The CSS class returned to the drag source when drop is allowed (defaults to "x-dd-drop-ok").\r
+ */\r
+ dropAllowed : "x-dd-drop-ok",\r
+ <div id="cfg-Ext.dd.DragSource-dropNotAllowed"></div>/**\r
+ * @cfg {String} dropNotAllowed\r
+ * The CSS class returned to the drag source when drop is not allowed (defaults to "x-dd-drop-nodrop").\r
+ */\r
+ dropNotAllowed : "x-dd-drop-nodrop",\r
+\r
+ <div id="method-Ext.dd.DragSource-getDragData"></div>/**\r
+ * Returns the data object associated with this drag source\r
+ * @return {Object} data An object containing arbitrary data\r
+ */\r
+ getDragData : function(e){\r
+ return this.dragData;\r
+ },\r
+\r
+ // private\r
+ onDragEnter : function(e, id){\r
+ var target = Ext.dd.DragDropMgr.getDDById(id);\r
+ this.cachedTarget = target;\r
+ if(this.beforeDragEnter(target, e, id) !== false){\r
+ if(target.isNotifyTarget){\r
+ var status = target.notifyEnter(this, e, this.dragData);\r
+ this.proxy.setStatus(status);\r
+ }else{\r
+ this.proxy.setStatus(this.dropAllowed);\r
+ }\r
+ \r
+ if(this.afterDragEnter){\r
+ <div id="method-Ext.dd.DragSource-afterDragEnter"></div>/**\r
+ * An empty function by default, but provided so that you can perform a custom action\r
+ * when the dragged item enters the drop target by providing an implementation.\r
+ * @param {Ext.dd.DragDrop} target The drop target\r
+ * @param {Event} e The event object\r
+ * @param {String} id The id of the dragged element\r
+ * @method afterDragEnter\r
+ */\r
+ this.afterDragEnter(target, e, id);\r
+ }\r
+ }\r
+ },\r
+\r
+ <div id="method-Ext.dd.DragSource-beforeDragEnter"></div>/**\r
+ * An empty function by default, but provided so that you can perform a custom action\r
+ * before the dragged item enters the drop target and optionally cancel the onDragEnter.\r
+ * @param {Ext.dd.DragDrop} target The drop target\r
+ * @param {Event} e The event object\r
+ * @param {String} id The id of the dragged element\r
+ * @return {Boolean} isValid True if the drag event is valid, else false to cancel\r
+ */\r
+ beforeDragEnter : function(target, e, id){\r
+ return true;\r
+ },\r
+\r
+ // private\r
+ alignElWithMouse: function() {\r
+ Ext.dd.DragSource.superclass.alignElWithMouse.apply(this, arguments);\r
+ this.proxy.sync();\r
+ },\r
+\r
+ // private\r
+ onDragOver : function(e, id){\r
+ var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id);\r
+ if(this.beforeDragOver(target, e, id) !== false){\r
+ if(target.isNotifyTarget){\r
+ var status = target.notifyOver(this, e, this.dragData);\r
+ this.proxy.setStatus(status);\r
+ }\r
+\r
+ if(this.afterDragOver){\r
+ <div id="method-Ext.dd.DragSource-afterDragOver"></div>/**\r
+ * An empty function by default, but provided so that you can perform a custom action\r
+ * while the dragged item is over the drop target by providing an implementation.\r
+ * @param {Ext.dd.DragDrop} target The drop target\r
+ * @param {Event} e The event object\r
+ * @param {String} id The id of the dragged element\r
+ * @method afterDragOver\r
+ */\r
+ this.afterDragOver(target, e, id);\r
+ }\r
+ }\r
+ },\r
+\r
+ <div id="method-Ext.dd.DragSource-beforeDragOver"></div>/**\r
+ * An empty function by default, but provided so that you can perform a custom action\r
+ * while the dragged item is over the drop target and optionally cancel the onDragOver.\r
+ * @param {Ext.dd.DragDrop} target The drop target\r
+ * @param {Event} e The event object\r
+ * @param {String} id The id of the dragged element\r
+ * @return {Boolean} isValid True if the drag event is valid, else false to cancel\r
+ */\r
+ beforeDragOver : function(target, e, id){\r
+ return true;\r
+ },\r
+\r
+ // private\r
+ onDragOut : function(e, id){\r
+ var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id);\r
+ if(this.beforeDragOut(target, e, id) !== false){\r
+ if(target.isNotifyTarget){\r
+ target.notifyOut(this, e, this.dragData);\r
+ }\r
+ this.proxy.reset();\r
+ if(this.afterDragOut){\r
+ <div id="method-Ext.dd.DragSource-afterDragOut"></div>/**\r
+ * An empty function by default, but provided so that you can perform a custom action\r
+ * after the dragged item is dragged out of the target without dropping.\r
+ * @param {Ext.dd.DragDrop} target The drop target\r
+ * @param {Event} e The event object\r
+ * @param {String} id The id of the dragged element\r
+ * @method afterDragOut\r
+ */\r
+ this.afterDragOut(target, e, id);\r
+ }\r
+ }\r
+ this.cachedTarget = null;\r
+ },\r
+\r
+ <div id="method-Ext.dd.DragSource-beforeDragOut"></div>/**\r
+ * An empty function by default, but provided so that you can perform a custom action before the dragged\r
+ * item is dragged out of the target without dropping, and optionally cancel the onDragOut.\r
+ * @param {Ext.dd.DragDrop} target The drop target\r
+ * @param {Event} e The event object\r
+ * @param {String} id The id of the dragged element\r
+ * @return {Boolean} isValid True if the drag event is valid, else false to cancel\r
+ */\r
+ beforeDragOut : function(target, e, id){\r
+ return true;\r
+ },\r
+ \r
+ // private\r
+ onDragDrop : function(e, id){\r
+ var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id);\r
+ if(this.beforeDragDrop(target, e, id) !== false){\r
+ if(target.isNotifyTarget){\r
+ if(target.notifyDrop(this, e, this.dragData)){ // valid drop?\r
+ this.onValidDrop(target, e, id);\r
+ }else{\r
+ this.onInvalidDrop(target, e, id);\r
+ }\r
+ }else{\r
+ this.onValidDrop(target, e, id);\r
+ }\r
+ \r
+ if(this.afterDragDrop){\r
+ <div id="method-Ext.dd.DragSource-afterDragDrop"></div>/**\r
+ * An empty function by default, but provided so that you can perform a custom action\r
+ * after a valid drag drop has occurred by providing an implementation.\r
+ * @param {Ext.dd.DragDrop} target The drop target\r
+ * @param {Event} e The event object\r
+ * @param {String} id The id of the dropped element\r
+ * @method afterDragDrop\r
+ */\r
+ this.afterDragDrop(target, e, id);\r
+ }\r
+ }\r
+ delete this.cachedTarget;\r
+ },\r
+\r
+ <div id="method-Ext.dd.DragSource-beforeDragDrop"></div>/**\r
+ * An empty function by default, but provided so that you can perform a custom action before the dragged\r
+ * item is dropped onto the target and optionally cancel the onDragDrop.\r
+ * @param {Ext.dd.DragDrop} target The drop target\r
+ * @param {Event} e The event object\r
+ * @param {String} id The id of the dragged element\r
+ * @return {Boolean} isValid True if the drag drop event is valid, else false to cancel\r
+ */\r
+ beforeDragDrop : function(target, e, id){\r
+ return true;\r
+ },\r
+\r
+ // private\r
+ onValidDrop : function(target, e, id){\r
+ this.hideProxy();\r
+ if(this.afterValidDrop){\r
+ /**\r
+ * An empty function by default, but provided so that you can perform a custom action\r
+ * after a valid drop has occurred by providing an implementation.\r
+ * @param {Object} target The target DD \r
+ * @param {Event} e The event object\r
+ * @param {String} id The id of the dropped element\r
+ * @method afterInvalidDrop\r
+ */\r
+ this.afterValidDrop(target, e, id);\r
+ }\r
+ },\r
+\r
+ // private\r
+ getRepairXY : function(e, data){\r
+ return this.el.getXY(); \r
+ },\r
+\r
+ // private\r
+ onInvalidDrop : function(target, e, id){\r
+ this.beforeInvalidDrop(target, e, id);\r
+ if(this.cachedTarget){\r
+ if(this.cachedTarget.isNotifyTarget){\r
+ this.cachedTarget.notifyOut(this, e, this.dragData);\r
+ }\r
+ this.cacheTarget = null;\r
+ }\r
+ this.proxy.repair(this.getRepairXY(e, this.dragData), this.afterRepair, this);\r
+\r
+ if(this.afterInvalidDrop){\r
+ <div id="method-Ext.dd.DragSource-afterInvalidDrop"></div>/**\r
+ * An empty function by default, but provided so that you can perform a custom action\r
+ * after an invalid drop has occurred by providing an implementation.\r
+ * @param {Event} e The event object\r
+ * @param {String} id The id of the dropped element\r
+ * @method afterInvalidDrop\r
+ */\r
+ this.afterInvalidDrop(e, id);\r
+ }\r
+ },\r
+\r
+ // private\r
+ afterRepair : function(){\r
+ if(Ext.enableFx){\r
+ this.el.highlight(this.hlColor || "c3daf9");\r
+ }\r
+ this.dragging = false;\r
+ },\r
+\r
+ <div id="method-Ext.dd.DragSource-beforeInvalidDrop"></div>/**\r
+ * An empty function by default, but provided so that you can perform a custom action after an invalid\r
+ * drop has occurred.\r
+ * @param {Ext.dd.DragDrop} target The drop target\r
+ * @param {Event} e The event object\r
+ * @param {String} id The id of the dragged element\r
+ * @return {Boolean} isValid True if the invalid drop should proceed, else false to cancel\r
+ */\r
+ beforeInvalidDrop : function(target, e, id){\r
+ return true;\r
+ },\r
+\r
+ // private\r
+ handleMouseDown : function(e){\r
+ if(this.dragging) {\r
+ return;\r
+ }\r
+ var data = this.getDragData(e);\r
+ if(data && this.onBeforeDrag(data, e) !== false){\r
+ this.dragData = data;\r
+ this.proxy.stop();\r
+ Ext.dd.DragSource.superclass.handleMouseDown.apply(this, arguments);\r
+ } \r
+ },\r
+\r
+ <div id="method-Ext.dd.DragSource-onBeforeDrag"></div>/**\r
+ * An empty function by default, but provided so that you can perform a custom action before the initial\r
+ * drag event begins and optionally cancel it.\r
+ * @param {Object} data An object containing arbitrary data to be shared with drop targets\r
+ * @param {Event} e The event object\r
+ * @return {Boolean} isValid True if the drag event is valid, else false to cancel\r
+ */\r
+ onBeforeDrag : function(data, e){\r
+ return true;\r
+ },\r
+\r
+ <div id="method-Ext.dd.DragSource-onStartDrag"></div>/**\r
+ * An empty function by default, but provided so that you can perform a custom action once the initial\r
+ * drag event has begun. The drag cannot be canceled from this function.\r
+ * @param {Number} x The x position of the click on the dragged object\r
+ * @param {Number} y The y position of the click on the dragged object\r
+ */\r
+ onStartDrag : Ext.emptyFn,\r
+\r
+ // private override\r
+ startDrag : function(x, y){\r
+ this.proxy.reset();\r
+ this.dragging = true;\r
+ this.proxy.update("");\r
+ this.onInitDrag(x, y);\r
+ this.proxy.show();\r
+ },\r
+\r
+ // private\r
+ onInitDrag : function(x, y){\r
+ var clone = this.el.dom.cloneNode(true);\r
+ clone.id = Ext.id(); // prevent duplicate ids\r
+ this.proxy.update(clone);\r
+ this.onStartDrag(x, y);\r
+ return true;\r
+ },\r
+\r
+ <div id="method-Ext.dd.DragSource-getProxy"></div>/**\r
+ * Returns the drag source's underlying {@link Ext.dd.StatusProxy}\r
+ * @return {Ext.dd.StatusProxy} proxy The StatusProxy\r
+ */\r
+ getProxy : function(){\r
+ return this.proxy; \r
+ },\r
+\r
+ <div id="method-Ext.dd.DragSource-hideProxy"></div>/**\r
+ * Hides the drag source's {@link Ext.dd.StatusProxy}\r
+ */\r
+ hideProxy : function(){\r
+ this.proxy.hide(); \r
+ this.proxy.reset(true);\r
+ this.dragging = false;\r
+ },\r
+\r
+ // private\r
+ triggerCacheRefresh : function(){\r
+ Ext.dd.DDM.refreshCache(this.groups);\r
+ },\r
+\r
+ // private - override to prevent hiding\r
+ b4EndDrag: function(e) {\r
+ },\r
+\r
+ // private - override to prevent moving\r
+ endDrag : function(e){\r
+ this.onEndDrag(this.dragData, e);\r
+ },\r
+\r
+ // private\r
+ onEndDrag : function(data, e){\r
+ },\r
+ \r
+ // private - pin to cursor\r
+ autoOffset : function(x, y) {\r
+ this.setDelta(-12, -20);\r
+ } \r
+});</pre> \r
+</body>\r
+</html>
\ No newline at end of file