Upgrade to ExtJS 3.1.0 - Released 12/16/2009
[extjs.git] / docs / source / DragZone.html
1 <html>\r
2 <head>\r
3   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />    \r
4   <title>The source code</title>\r
5     <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />\r
6     <script type="text/javascript" src="../resources/prettify/prettify.js"></script>\r
7 </head>\r
8 <body  onload="prettyPrint();">\r
9     <pre class="prettyprint lang-js"><div id="cls-Ext.dd.DragZone"></div>/**\r
10  * @class Ext.dd.DragZone\r
11  * @extends Ext.dd.DragSource\r
12  * <p>This class provides a container DD instance that allows dragging of multiple child source nodes.</p>\r
13  * <p>This class does not move the drag target nodes, but a proxy element which may contain\r
14  * any DOM structure you wish. The DOM element to show in the proxy is provided by either a\r
15  * provided implementation of {@link #getDragData}, or by registered draggables registered with {@link Ext.dd.Registry}</p>\r
16  * <p>If you wish to provide draggability for an arbitrary number of DOM nodes, each of which represent some\r
17  * application object (For example nodes in a {@link Ext.DataView DataView}) then use of this class\r
18  * is the most efficient way to "activate" those nodes.</p>\r
19  * <p>By default, this class requires that draggable child nodes are registered with {@link Ext.dd.Registry}.\r
20  * However a simpler way to allow a DragZone to manage any number of draggable elements is to configure\r
21  * the DragZone with  an implementation of the {@link #getDragData} method which interrogates the passed\r
22  * mouse event to see if it has taken place within an element, or class of elements. This is easily done\r
23  * by using the event's {@link Ext.EventObject#getTarget getTarget} method to identify a node based on a\r
24  * {@link Ext.DomQuery} selector. For example, to make the nodes of a DataView draggable, use the following\r
25  * technique. Knowledge of the use of the DataView is required:</p><pre><code>\r
26 myDataView.on('render', function(v) {\r
27     myDataView.dragZone = new Ext.dd.DragZone(v.getEl(), {\r
28 \r
29 //      On receipt of a mousedown event, see if it is within a DataView node.\r
30 //      Return a drag data object if so.\r
31         getDragData: function(e) {\r
32 \r
33 //          Use the DataView's own itemSelector (a mandatory property) to\r
34 //          test if the mousedown is within one of the DataView's nodes.\r
35             var sourceEl = e.getTarget(v.itemSelector, 10);\r
36 \r
37 //          If the mousedown is within a DataView node, clone the node to produce\r
38 //          a ddel element for use by the drag proxy. Also add application data\r
39 //          to the returned data object.\r
40             if (sourceEl) {\r
41                 d = sourceEl.cloneNode(true);\r
42                 d.id = Ext.id();\r
43                 return {\r
44                     ddel: d,\r
45                     sourceEl: sourceEl,\r
46                     repairXY: Ext.fly(sourceEl).getXY(),\r
47                     sourceStore: v.store,\r
48                     draggedRecord: v.{@link Ext.DataView#getRecord getRecord}(sourceEl)\r
49                 }\r
50             }\r
51         },\r
52 \r
53 //      Provide coordinates for the proxy to slide back to on failed drag.\r
54 //      This is the original XY coordinates of the draggable element captured\r
55 //      in the getDragData method.\r
56         getRepairXY: function() {\r
57             return this.dragData.repairXY;\r
58         }\r
59     });\r
60 });</code></pre>\r
61  * See the {@link Ext.dd.DropZone DropZone} documentation for details about building a DropZone which\r
62  * cooperates with this DragZone.\r
63  * @constructor\r
64  * @param {Mixed} el The container element\r
65  * @param {Object} config\r
66  */\r
67 Ext.dd.DragZone = function(el, config){\r
68     Ext.dd.DragZone.superclass.constructor.call(this, el, config);\r
69     if(this.containerScroll){\r
70         Ext.dd.ScrollManager.register(this.el);\r
71     }\r
72 };\r
73 \r
74 Ext.extend(Ext.dd.DragZone, Ext.dd.DragSource, {\r
75     <div id="prop-Ext.dd.DragZone-dragData"></div>/**\r
76      * This property contains the data representing the dragged object. This data is set up by the implementation\r
77      * of the {@link #getDragData} method. It must contain a <tt>ddel</tt> property, but can contain\r
78      * any other data according to the application's needs.\r
79      * @type Object\r
80      * @property dragData\r
81      */\r
82     <div id="cfg-Ext.dd.DragZone-containerScroll"></div>/**\r
83      * @cfg {Boolean} containerScroll True to register this container with the Scrollmanager\r
84      * for auto scrolling during drag operations.\r
85      */\r
86     <div id="cfg-Ext.dd.DragZone-hlColor"></div>/**\r
87      * @cfg {String} hlColor The color to use when visually highlighting the drag source in the afterRepair\r
88      * method after a failed drop (defaults to "c3daf9" - light blue)\r
89      */\r
90 \r
91     <div id="method-Ext.dd.DragZone-getDragData"></div>/**\r
92      * Called when a mousedown occurs in this container. Looks in {@link Ext.dd.Registry}\r
93      * for a valid target to drag based on the mouse down. Override this method\r
94      * to provide your own lookup logic (e.g. finding a child by class name). Make sure your returned\r
95      * object has a "ddel" attribute (with an HTML Element) for other functions to work.\r
96      * @param {EventObject} e The mouse down event\r
97      * @return {Object} The dragData\r
98      */\r
99     getDragData : function(e){\r
100         return Ext.dd.Registry.getHandleFromEvent(e);\r
101     },\r
102     \r
103     <div id="method-Ext.dd.DragZone-onInitDrag"></div>/**\r
104      * Called once drag threshold has been reached to initialize the proxy element. By default, it clones the\r
105      * this.dragData.ddel\r
106      * @param {Number} x The x position of the click on the dragged object\r
107      * @param {Number} y The y position of the click on the dragged object\r
108      * @return {Boolean} true to continue the drag, false to cancel\r
109      */\r
110     onInitDrag : function(x, y){\r
111         this.proxy.update(this.dragData.ddel.cloneNode(true));\r
112         this.onStartDrag(x, y);\r
113         return true;\r
114     },\r
115     \r
116     <div id="method-Ext.dd.DragZone-afterRepair"></div>/**\r
117      * Called after a repair of an invalid drop. By default, highlights this.dragData.ddel \r
118      */\r
119     afterRepair : function(){\r
120         if(Ext.enableFx){\r
121             Ext.Element.fly(this.dragData.ddel).highlight(this.hlColor || "c3daf9");\r
122         }\r
123         this.dragging = false;\r
124     },\r
125 \r
126     <div id="method-Ext.dd.DragZone-getRepairXY"></div>/**\r
127      * Called before a repair of an invalid drop to get the XY to animate to. By default returns\r
128      * the XY of this.dragData.ddel\r
129      * @param {EventObject} e The mouse up event\r
130      * @return {Array} The xy location (e.g. [100, 200])\r
131      */\r
132     getRepairXY : function(e){\r
133         return Ext.Element.fly(this.dragData.ddel).getXY();  \r
134     }\r
135 });</pre>    \r
136 </body>\r
137 </html>