Rev 1422 | Blame | Compare with Previous | Last modification | View Log | RSS feed
/*Copyright (c) 2004-2006, The Dojo FoundationAll Rights Reserved.Licensed under the Academic Free License version 2.1 or above OR themodified BSD license. For more information on Dojo licensing, see:http://dojotoolkit.org/community/licensing.shtml*/dojo.provide("dojo.widget.Manager");dojo.require("dojo.lang.array");dojo.require("dojo.lang.func");dojo.require("dojo.event.*");dojo.widget.manager = new function () {this.widgets = [];this.widgetIds = [];this.topWidgets = {};var widgetTypeCtr = {};var renderPrefixCache = [];this.getUniqueId = function (widgetType) {var widgetId;do {widgetId = widgetType + "_" + (widgetTypeCtr[widgetType] != undefined ? ++widgetTypeCtr[widgetType] : widgetTypeCtr[widgetType] = 0);} while (this.getWidgetById(widgetId));return widgetId;};this.add = function (widget) {this.widgets.push(widget);if (!widget.extraArgs["id"]) {widget.extraArgs["id"] = widget.extraArgs["ID"];}if (widget.widgetId == "") {if (widget["id"]) {widget.widgetId = widget["id"];} else {if (widget.extraArgs["id"]) {widget.widgetId = widget.extraArgs["id"];} else {widget.widgetId = this.getUniqueId(widget.ns + "_" + widget.widgetType);}}}if (this.widgetIds[widget.widgetId]) {dojo.debug("widget ID collision on ID: " + widget.widgetId);}this.widgetIds[widget.widgetId] = widget;};this.destroyAll = function () {for (var x = this.widgets.length - 1; x >= 0; x--) {try {this.widgets[x].destroy(true);delete this.widgets[x];}catch (e) {}}};this.remove = function (widgetIndex) {if (dojo.lang.isNumber(widgetIndex)) {var tw = this.widgets[widgetIndex].widgetId;delete this.topWidgets[tw];delete this.widgetIds[tw];this.widgets.splice(widgetIndex, 1);} else {this.removeById(widgetIndex);}};this.removeById = function (id) {if (!dojo.lang.isString(id)) {id = id["widgetId"];if (!id) {dojo.debug("invalid widget or id passed to removeById");return;}}for (var i = 0; i < this.widgets.length; i++) {if (this.widgets[i].widgetId == id) {this.remove(i);break;}}};this.getWidgetById = function (id) {if (dojo.lang.isString(id)) {return this.widgetIds[id];}return id;};this.getWidgetsByType = function (type) {var lt = type.toLowerCase();var getType = (type.indexOf(":") < 0 ? function (x) {return x.widgetType.toLowerCase();} : function (x) {return x.getNamespacedType();});var ret = [];dojo.lang.forEach(this.widgets, function (x) {if (getType(x) == lt) {ret.push(x);}});return ret;};this.getWidgetsByFilter = function (unaryFunc, onlyOne) {var ret = [];dojo.lang.every(this.widgets, function (x) {if (unaryFunc(x)) {ret.push(x);if (onlyOne) {return false;}}return true;});return (onlyOne ? ret[0] : ret);};this.getAllWidgets = function () {return this.widgets.concat();};this.getWidgetByNode = function (node) {var w = this.getAllWidgets();node = dojo.byId(node);for (var i = 0; i < w.length; i++) {if (w[i].domNode == node) {return w[i];}}return null;};this.byId = this.getWidgetById;this.byType = this.getWidgetsByType;this.byFilter = this.getWidgetsByFilter;this.byNode = this.getWidgetByNode;var knownWidgetImplementations = {};var widgetPackages = ["dojo.widget"];for (var i = 0; i < widgetPackages.length; i++) {widgetPackages[widgetPackages[i]] = true;}this.registerWidgetPackage = function (pname) {if (!widgetPackages[pname]) {widgetPackages[pname] = true;widgetPackages.push(pname);}};this.getWidgetPackageList = function () {return dojo.lang.map(widgetPackages, function (elt) {return (elt !== true ? elt : undefined);});};this.getImplementation = function (widgetName, ctorObject, mixins, ns) {var impl = this.getImplementationName(widgetName, ns);if (impl) {var ret = ctorObject ? new impl(ctorObject) : new impl();return ret;}};function buildPrefixCache() {for (var renderer in dojo.render) {if (dojo.render[renderer]["capable"] === true) {var prefixes = dojo.render[renderer].prefixes;for (var i = 0; i < prefixes.length; i++) {renderPrefixCache.push(prefixes[i].toLowerCase());}}}}var findImplementationInModule = function (lowerCaseWidgetName, module) {if (!module) {return null;}for (var i = 0, l = renderPrefixCache.length, widgetModule; i <= l; i++) {widgetModule = (i < l ? module[renderPrefixCache[i]] : module);if (!widgetModule) {continue;}for (var name in widgetModule) {if (name.toLowerCase() == lowerCaseWidgetName) {return widgetModule[name];}}}return null;};var findImplementation = function (lowerCaseWidgetName, moduleName) {var module = dojo.evalObjPath(moduleName, false);return (module ? findImplementationInModule(lowerCaseWidgetName, module) : null);};this.getImplementationName = function (widgetName, ns) {var lowerCaseWidgetName = widgetName.toLowerCase();ns = ns || "dojo";var imps = knownWidgetImplementations[ns] || (knownWidgetImplementations[ns] = {});var impl = imps[lowerCaseWidgetName];if (impl) {return impl;}if (!renderPrefixCache.length) {buildPrefixCache();}var nsObj = dojo.ns.get(ns);if (!nsObj) {dojo.ns.register(ns, ns + ".widget");nsObj = dojo.ns.get(ns);}if (nsObj) {nsObj.resolve(widgetName);}impl = findImplementation(lowerCaseWidgetName, nsObj.module);if (impl) {return (imps[lowerCaseWidgetName] = impl);}nsObj = dojo.ns.require(ns);if ((nsObj) && (nsObj.resolver)) {nsObj.resolve(widgetName);impl = findImplementation(lowerCaseWidgetName, nsObj.module);if (impl) {return (imps[lowerCaseWidgetName] = impl);}}dojo.deprecated("dojo.widget.Manager.getImplementationName", "Could not locate widget implementation for \"" + widgetName + "\" in \"" + nsObj.module + "\" registered to namespace \"" + nsObj.name + "\". " + "Developers must specify correct namespaces for all non-Dojo widgets", "0.5");for (var i = 0; i < widgetPackages.length; i++) {impl = findImplementation(lowerCaseWidgetName, widgetPackages[i]);if (impl) {return (imps[lowerCaseWidgetName] = impl);}}throw new Error("Could not locate widget implementation for \"" + widgetName + "\" in \"" + nsObj.module + "\" registered to namespace \"" + nsObj.name + "\"");};this.resizing = false;this.onWindowResized = function () {if (this.resizing) {return;}try {this.resizing = true;for (var id in this.topWidgets) {var child = this.topWidgets[id];if (child.checkSize) {child.checkSize();}}}catch (e) {}finally {this.resizing = false;}};if (typeof window != "undefined") {dojo.addOnLoad(this, "onWindowResized");dojo.event.connect(window, "onresize", this, "onWindowResized");}};(function () {var dw = dojo.widget;var dwm = dw.manager;var h = dojo.lang.curry(dojo.lang, "hitch", dwm);var g = function (oldName, newName) {dw[(newName || oldName)] = h(oldName);};g("add", "addWidget");g("destroyAll", "destroyAllWidgets");g("remove", "removeWidget");g("removeById", "removeWidgetById");g("getWidgetById");g("getWidgetById", "byId");g("getWidgetsByType");g("getWidgetsByFilter");g("getWidgetsByType", "byType");g("getWidgetsByFilter", "byFilter");g("getWidgetByNode", "byNode");dw.all = function (n) {var widgets = dwm.getAllWidgets.apply(dwm, arguments);if (arguments.length > 0) {return widgets[n];}return widgets;};g("registerWidgetPackage");g("getImplementation", "getWidgetImplementation");g("getImplementationName", "getWidgetImplementationName");dw.widgets = dwm.widgets;dw.widgetIds = dwm.widgetIds;dw.root = dwm.root;})();