Upgrade to ExtJS 3.1.0 - Released 12/16/2009
[extjs.git] / src / dd / Registry.js
1 /*!
2  * Ext JS Library 3.1.0
3  * Copyright(c) 2006-2009 Ext JS, LLC
4  * licensing@extjs.com
5  * http://www.extjs.com/license
6  */
7 /**\r
8  * @class Ext.dd.Registry\r
9  * Provides easy access to all drag drop components that are registered on a page.  Items can be retrieved either\r
10  * directly by DOM node id, or by passing in the drag drop event that occurred and looking up the event target.\r
11  * @singleton\r
12  */\r
13 Ext.dd.Registry = function(){\r
14     var elements = {}; \r
15     var handles = {}; \r
16     var autoIdSeed = 0;\r
17 \r
18     var getId = function(el, autogen){\r
19         if(typeof el == "string"){\r
20             return el;\r
21         }\r
22         var id = el.id;\r
23         if(!id && autogen !== false){\r
24             id = "extdd-" + (++autoIdSeed);\r
25             el.id = id;\r
26         }\r
27         return id;\r
28     };\r
29     \r
30     return {\r
31     /**\r
32      * Resgister a drag drop element\r
33      * @param {String/HTMLElement) element The id or DOM node to register\r
34      * @param {Object} data (optional) An custom data object that will be passed between the elements that are involved\r
35      * in drag drop operations.  You can populate this object with any arbitrary properties that your own code\r
36      * knows how to interpret, plus there are some specific properties known to the Registry that should be\r
37      * populated in the data object (if applicable):\r
38      * <pre>\r
39 Value      Description<br />\r
40 ---------  ------------------------------------------<br />\r
41 handles    Array of DOM nodes that trigger dragging<br />\r
42            for the element being registered<br />\r
43 isHandle   True if the element passed in triggers<br />\r
44            dragging itself, else false\r
45 </pre>\r
46      */\r
47         register : function(el, data){\r
48             data = data || {};\r
49             if(typeof el == "string"){\r
50                 el = document.getElementById(el);\r
51             }\r
52             data.ddel = el;\r
53             elements[getId(el)] = data;\r
54             if(data.isHandle !== false){\r
55                 handles[data.ddel.id] = data;\r
56             }\r
57             if(data.handles){\r
58                 var hs = data.handles;\r
59                 for(var i = 0, len = hs.length; i < len; i++){\r
60                         handles[getId(hs[i])] = data;\r
61                 }\r
62             }\r
63         },\r
64 \r
65     /**\r
66      * Unregister a drag drop element\r
67      * @param {String/HTMLElement) element The id or DOM node to unregister\r
68      */\r
69         unregister : function(el){\r
70             var id = getId(el, false);\r
71             var data = elements[id];\r
72             if(data){\r
73                 delete elements[id];\r
74                 if(data.handles){\r
75                     var hs = data.handles;\r
76                     for(var i = 0, len = hs.length; i < len; i++){\r
77                         delete handles[getId(hs[i], false)];\r
78                     }\r
79                 }\r
80             }\r
81         },\r
82 \r
83     /**\r
84      * Returns the handle registered for a DOM Node by id\r
85      * @param {String/HTMLElement} id The DOM node or id to look up\r
86      * @return {Object} handle The custom handle data\r
87      */\r
88         getHandle : function(id){\r
89             if(typeof id != "string"){ // must be element?\r
90                 id = id.id;\r
91             }\r
92             return handles[id];\r
93         },\r
94 \r
95     /**\r
96      * Returns the handle that is registered for the DOM node that is the target of the event\r
97      * @param {Event} e The event\r
98      * @return {Object} handle The custom handle data\r
99      */\r
100         getHandleFromEvent : function(e){\r
101             var t = Ext.lib.Event.getTarget(e);\r
102             return t ? handles[t.id] : null;\r
103         },\r
104 \r
105     /**\r
106      * Returns a custom data object that is registered for a DOM node by id\r
107      * @param {String/HTMLElement} id The DOM node or id to look up\r
108      * @return {Object} data The custom data\r
109      */\r
110         getTarget : function(id){\r
111             if(typeof id != "string"){ // must be element?\r
112                 id = id.id;\r
113             }\r
114             return elements[id];\r
115         },\r
116 \r
117     /**\r
118      * Returns a custom data object that is registered for the DOM node that is the target of the event\r
119      * @param {Event} e The event\r
120      * @return {Object} data The custom data\r
121      */\r
122         getTargetFromEvent : function(e){\r
123             var t = Ext.lib.Event.getTarget(e);\r
124             return t ? elements[t.id] || handles[t.id] : null;\r
125         }\r
126     };\r
127 }();