Upgrade to ExtJS 3.0.0 - Released 07/06/2009
[extjs.git] / src / dd / Registry.js
diff --git a/src/dd/Registry.js b/src/dd/Registry.js
new file mode 100644 (file)
index 0000000..ba0a792
--- /dev/null
@@ -0,0 +1,127 @@
+/*!
+ * Ext JS Library 3.0.0
+ * Copyright(c) 2006-2009 Ext JS, LLC
+ * licensing@extjs.com
+ * http://www.extjs.com/license
+ */
+/**\r
+ * @class Ext.dd.Registry\r
+ * Provides easy access to all drag drop components that are registered on a page.  Items can be retrieved either\r
+ * directly by DOM node id, or by passing in the drag drop event that occurred and looking up the event target.\r
+ * @singleton\r
+ */\r
+Ext.dd.Registry = function(){\r
+    var elements = {}; \r
+    var handles = {}; \r
+    var autoIdSeed = 0;\r
+\r
+    var getId = function(el, autogen){\r
+        if(typeof el == "string"){\r
+            return el;\r
+        }\r
+        var id = el.id;\r
+        if(!id && autogen !== false){\r
+            id = "extdd-" + (++autoIdSeed);\r
+            el.id = id;\r
+        }\r
+        return id;\r
+    };\r
+    \r
+    return {\r
+    /**\r
+     * Resgister a drag drop element\r
+     * @param {String/HTMLElement) element The id or DOM node to register\r
+     * @param {Object} data (optional) An custom data object that will be passed between the elements that are involved\r
+     * in drag drop operations.  You can populate this object with any arbitrary properties that your own code\r
+     * knows how to interpret, plus there are some specific properties known to the Registry that should be\r
+     * populated in the data object (if applicable):\r
+     * <pre>\r
+Value      Description<br />\r
+---------  ------------------------------------------<br />\r
+handles    Array of DOM nodes that trigger dragging<br />\r
+           for the element being registered<br />\r
+isHandle   True if the element passed in triggers<br />\r
+           dragging itself, else false\r
+</pre>\r
+     */\r
+        register : function(el, data){\r
+            data = data || {};\r
+            if(typeof el == "string"){\r
+                el = document.getElementById(el);\r
+            }\r
+            data.ddel = el;\r
+            elements[getId(el)] = data;\r
+            if(data.isHandle !== false){\r
+                handles[data.ddel.id] = data;\r
+            }\r
+            if(data.handles){\r
+                var hs = data.handles;\r
+                for(var i = 0, len = hs.length; i < len; i++){\r
+                       handles[getId(hs[i])] = data;\r
+                }\r
+            }\r
+        },\r
+\r
+    /**\r
+     * Unregister a drag drop element\r
+     * @param {String/HTMLElement) element The id or DOM node to unregister\r
+     */\r
+        unregister : function(el){\r
+            var id = getId(el, false);\r
+            var data = elements[id];\r
+            if(data){\r
+                delete elements[id];\r
+                if(data.handles){\r
+                    var hs = data.handles;\r
+                    for(var i = 0, len = hs.length; i < len; i++){\r
+                       delete handles[getId(hs[i], false)];\r
+                    }\r
+                }\r
+            }\r
+        },\r
+\r
+    /**\r
+     * Returns the handle registered for a DOM Node by id\r
+     * @param {String/HTMLElement} id The DOM node or id to look up\r
+     * @return {Object} handle The custom handle data\r
+     */\r
+        getHandle : function(id){\r
+            if(typeof id != "string"){ // must be element?\r
+                id = id.id;\r
+            }\r
+            return handles[id];\r
+        },\r
+\r
+    /**\r
+     * Returns the handle that is registered for the DOM node that is the target of the event\r
+     * @param {Event} e The event\r
+     * @return {Object} handle The custom handle data\r
+     */\r
+        getHandleFromEvent : function(e){\r
+            var t = Ext.lib.Event.getTarget(e);\r
+            return t ? handles[t.id] : null;\r
+        },\r
+\r
+    /**\r
+     * Returns a custom data object that is registered for a DOM node by id\r
+     * @param {String/HTMLElement} id The DOM node or id to look up\r
+     * @return {Object} data The custom data\r
+     */\r
+        getTarget : function(id){\r
+            if(typeof id != "string"){ // must be element?\r
+                id = id.id;\r
+            }\r
+            return elements[id];\r
+        },\r
+\r
+    /**\r
+     * Returns a custom data object that is registered for the DOM node that is the target of the event\r
+     * @param {Event} e The event\r
+     * @return {Object} data The custom data\r
+     */\r
+        getTargetFromEvent : function(e){\r
+            var t = Ext.lib.Event.getTarget(e);\r
+            return t ? elements[t.id] || handles[t.id] : null;\r
+        }\r
+    };\r
+}();
\ No newline at end of file