| /* |
| Copyright (c) 2004-2006, The Dojo Foundation |
| All Rights Reserved. |
| |
| Licensed under the Academic Free License version 2.1 or above OR the |
| modified BSD license. For more information on Dojo licensing, see: |
| |
| http://dojotoolkit.org/community/licensing.shtml |
| */ |
| |
| |
| |
| dojo.provide("dojo.widget.Widget"); |
| dojo.require("dojo.lang.func"); |
| dojo.require("dojo.lang.array"); |
| dojo.require("dojo.lang.extras"); |
| dojo.require("dojo.lang.declare"); |
| dojo.require("dojo.ns"); |
| dojo.require("dojo.widget.Manager"); |
| dojo.require("dojo.event.*"); |
| dojo.require("dojo.a11y"); |
| dojo.declare("dojo.widget.Widget", null, function () { |
| this.children = []; |
| this.extraArgs = {}; |
| }, {parent:null, isTopLevel:false, disabled:false, isContainer:false, widgetId:"", widgetType:"Widget", ns:"dojo", getNamespacedType:function () { |
| return (this.ns ? this.ns + ":" + this.widgetType : this.widgetType).toLowerCase(); |
| }, toString:function () { |
| return "[Widget " + this.getNamespacedType() + ", " + (this.widgetId || "NO ID") + "]"; |
| }, repr:function () { |
| return this.toString(); |
| }, enable:function () { |
| this.disabled = false; |
| }, disable:function () { |
| this.disabled = true; |
| }, onResized:function () { |
| this.notifyChildrenOfResize(); |
| }, notifyChildrenOfResize:function () { |
| for (var i = 0; i < this.children.length; i++) { |
| var child = this.children[i]; |
| if (child.onResized) { |
| child.onResized(); |
| } |
| } |
| }, create:function (args, fragment, parent, ns) { |
| if (ns) { |
| this.ns = ns; |
| } |
| this.satisfyPropertySets(args, fragment, parent); |
| this.mixInProperties(args, fragment, parent); |
| this.postMixInProperties(args, fragment, parent); |
| dojo.widget.manager.add(this); |
| this.buildRendering(args, fragment, parent); |
| this.initialize(args, fragment, parent); |
| this.postInitialize(args, fragment, parent); |
| this.postCreate(args, fragment, parent); |
| return this; |
| }, destroy:function (finalize) { |
| if (this.parent) { |
| this.parent.removeChild(this); |
| } |
| this.destroyChildren(); |
| this.uninitialize(); |
| this.destroyRendering(finalize); |
| dojo.widget.manager.removeById(this.widgetId); |
| }, destroyChildren:function () { |
| var widget; |
| var i = 0; |
| while (this.children.length > i) { |
| widget = this.children[i]; |
| if (widget instanceof dojo.widget.Widget) { |
| this.removeChild(widget); |
| widget.destroy(); |
| continue; |
| } |
| i++; |
| } |
| }, getChildrenOfType:function (type, recurse) { |
| var ret = []; |
| var isFunc = dojo.lang.isFunction(type); |
| if (!isFunc) { |
| type = type.toLowerCase(); |
| } |
| for (var x = 0; x < this.children.length; x++) { |
| if (isFunc) { |
| if (this.children[x] instanceof type) { |
| ret.push(this.children[x]); |
| } |
| } else { |
| if (this.children[x].widgetType.toLowerCase() == type) { |
| ret.push(this.children[x]); |
| } |
| } |
| if (recurse) { |
| ret = ret.concat(this.children[x].getChildrenOfType(type, recurse)); |
| } |
| } |
| return ret; |
| }, getDescendants:function () { |
| var result = []; |
| var stack = [this]; |
| var elem; |
| while ((elem = stack.pop())) { |
| result.push(elem); |
| if (elem.children) { |
| dojo.lang.forEach(elem.children, function (elem) { |
| stack.push(elem); |
| }); |
| } |
| } |
| return result; |
| }, isFirstChild:function () { |
| return this === this.parent.children[0]; |
| }, isLastChild:function () { |
| return this === this.parent.children[this.parent.children.length - 1]; |
| }, satisfyPropertySets:function (args) { |
| return args; |
| }, mixInProperties:function (args, frag) { |
| if ((args["fastMixIn"]) || (frag["fastMixIn"])) { |
| for (var x in args) { |
| this[x] = args[x]; |
| } |
| return; |
| } |
| var undef; |
| var lcArgs = dojo.widget.lcArgsCache[this.widgetType]; |
| if (lcArgs == null) { |
| lcArgs = {}; |
| for (var y in this) { |
| lcArgs[((new String(y)).toLowerCase())] = y; |
| } |
| dojo.widget.lcArgsCache[this.widgetType] = lcArgs; |
| } |
| var visited = {}; |
| for (var x in args) { |
| if (!this[x]) { |
| var y = lcArgs[(new String(x)).toLowerCase()]; |
| if (y) { |
| args[y] = args[x]; |
| x = y; |
| } |
| } |
| if (visited[x]) { |
| continue; |
| } |
| visited[x] = true; |
| if ((typeof this[x]) != (typeof undef)) { |
| if (typeof args[x] != "string") { |
| this[x] = args[x]; |
| } else { |
| if (dojo.lang.isString(this[x])) { |
| this[x] = args[x]; |
| } else { |
| if (dojo.lang.isNumber(this[x])) { |
| this[x] = new Number(args[x]); |
| } else { |
| if (dojo.lang.isBoolean(this[x])) { |
| this[x] = (args[x].toLowerCase() == "false") ? false : true; |
| } else { |
| if (dojo.lang.isFunction(this[x])) { |
| if (args[x].search(/[^\w\.]+/i) == -1) { |
| this[x] = dojo.evalObjPath(args[x], false); |
| } else { |
| var tn = dojo.lang.nameAnonFunc(new Function(args[x]), this); |
| dojo.event.kwConnect({srcObj:this, srcFunc:x, adviceObj:this, adviceFunc:tn}); |
| } |
| } else { |
| if (dojo.lang.isArray(this[x])) { |
| this[x] = args[x].split(";"); |
| } else { |
| if (this[x] instanceof Date) { |
| this[x] = new Date(Number(args[x])); |
| } else { |
| if (typeof this[x] == "object") { |
| if (this[x] instanceof dojo.uri.Uri) { |
| this[x] = dojo.uri.dojoUri(args[x]); |
| } else { |
| var pairs = args[x].split(";"); |
| for (var y = 0; y < pairs.length; y++) { |
| var si = pairs[y].indexOf(":"); |
| if ((si != -1) && (pairs[y].length > si)) { |
| this[x][pairs[y].substr(0, si).replace(/^\s+|\s+$/g, "")] = pairs[y].substr(si + 1); |
| } |
| } |
| } |
| } else { |
| this[x] = args[x]; |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| } else { |
| this.extraArgs[x.toLowerCase()] = args[x]; |
| } |
| } |
| }, postMixInProperties:function (args, frag, parent) { |
| }, initialize:function (args, frag, parent) { |
| return false; |
| }, postInitialize:function (args, frag, parent) { |
| return false; |
| }, postCreate:function (args, frag, parent) { |
| return false; |
| }, uninitialize:function () { |
| return false; |
| }, buildRendering:function (args, frag, parent) { |
| dojo.unimplemented("dojo.widget.Widget.buildRendering, on " + this.toString() + ", "); |
| return false; |
| }, destroyRendering:function () { |
| dojo.unimplemented("dojo.widget.Widget.destroyRendering"); |
| return false; |
| }, addedTo:function (parent) { |
| }, addChild:function (child) { |
| dojo.unimplemented("dojo.widget.Widget.addChild"); |
| return false; |
| }, removeChild:function (widget) { |
| for (var x = 0; x < this.children.length; x++) { |
| if (this.children[x] === widget) { |
| this.children.splice(x, 1); |
| widget.parent = null; |
| break; |
| } |
| } |
| return widget; |
| }, getPreviousSibling:function () { |
| var idx = this.getParentIndex(); |
| if (idx <= 0) { |
| return null; |
| } |
| return this.parent.children[idx - 1]; |
| }, getSiblings:function () { |
| return this.parent.children; |
| }, getParentIndex:function () { |
| return dojo.lang.indexOf(this.parent.children, this, true); |
| }, getNextSibling:function () { |
| var idx = this.getParentIndex(); |
| if (idx == this.parent.children.length - 1) { |
| return null; |
| } |
| if (idx < 0) { |
| return null; |
| } |
| return this.parent.children[idx + 1]; |
| }}); |
| dojo.widget.lcArgsCache = {}; |
| dojo.widget.tags = {}; |
| dojo.widget.tags.addParseTreeHandler = function (type) { |
| dojo.deprecated("addParseTreeHandler", ". ParseTreeHandlers are now reserved for components. Any unfiltered DojoML tag without a ParseTreeHandler is assumed to be a widget", "0.5"); |
| }; |
| dojo.widget.tags["dojo:propertyset"] = function (fragment, widgetParser, parentComp) { |
| var properties = widgetParser.parseProperties(fragment["dojo:propertyset"]); |
| }; |
| dojo.widget.tags["dojo:connect"] = function (fragment, widgetParser, parentComp) { |
| var properties = widgetParser.parseProperties(fragment["dojo:connect"]); |
| }; |
| dojo.widget.buildWidgetFromParseTree = function (type, frag, parser, parentComp, insertionIndex, localProps) { |
| dojo.a11y.setAccessibleMode(); |
| var stype = type.split(":"); |
| stype = (stype.length == 2) ? stype[1] : type; |
| var localProperties = localProps || parser.parseProperties(frag[frag["ns"] + ":" + stype]); |
| var twidget = dojo.widget.manager.getImplementation(stype, null, null, frag["ns"]); |
| if (!twidget) { |
| throw new Error("cannot find \"" + type + "\" widget"); |
| } else { |
| if (!twidget.create) { |
| throw new Error("\"" + type + "\" widget object has no \"create\" method and does not appear to implement *Widget"); |
| } |
| } |
| localProperties["dojoinsertionindex"] = insertionIndex; |
| var ret = twidget.create(localProperties, frag, parentComp, frag["ns"]); |
| return ret; |
| }; |
| dojo.widget.defineWidget = function (widgetClass, renderer, superclasses, init, props) { |
| if (dojo.lang.isString(arguments[3])) { |
| dojo.widget._defineWidget(arguments[0], arguments[3], arguments[1], arguments[4], arguments[2]); |
| } else { |
| var args = [arguments[0]], p = 3; |
| if (dojo.lang.isString(arguments[1])) { |
| args.push(arguments[1], arguments[2]); |
| } else { |
| args.push("", arguments[1]); |
| p = 2; |
| } |
| if (dojo.lang.isFunction(arguments[p])) { |
| args.push(arguments[p], arguments[p + 1]); |
| } else { |
| args.push(null, arguments[p]); |
| } |
| dojo.widget._defineWidget.apply(this, args); |
| } |
| }; |
| dojo.widget.defineWidget.renderers = "html|svg|vml"; |
| dojo.widget._defineWidget = function (widgetClass, renderer, superclasses, init, props) { |
| var module = widgetClass.split("."); |
| var type = module.pop(); |
| var regx = "\\.(" + (renderer ? renderer + "|" : "") + dojo.widget.defineWidget.renderers + ")\\."; |
| var r = widgetClass.search(new RegExp(regx)); |
| module = (r < 0 ? module.join(".") : widgetClass.substr(0, r)); |
| dojo.widget.manager.registerWidgetPackage(module); |
| var pos = module.indexOf("."); |
| var nsName = (pos > -1) ? module.substring(0, pos) : module; |
| props = (props) || {}; |
| props.widgetType = type; |
| if ((!init) && (props["classConstructor"])) { |
| init = props.classConstructor; |
| delete props.classConstructor; |
| } |
| dojo.declare(widgetClass, superclasses, init, props); |
| }; |
| |