Subversion Repositories Applications.papyrus

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
        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);
};