Subversion Repositories Applications.papyrus

Rev

Blame | Last modification | View Log | RSS feed

if(!dojo._hasResource["dojox.dtl.render.html"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
dojo._hasResource["dojox.dtl.render.html"] = true;
dojo.provide("dojox.dtl.render.html");

dojox.dtl.render.html.sensitivity = {
        // summary:
        //              Set conditions under which to buffer changes
        // description:
        //              Necessary if you make a lot of changes to your template.
        //              What happens is that the entire node, from the attached DOM Node
        //              down gets swapped with a clone, and until the entire rendering
        //              is complete, we don't replace the clone again. In this way, renders are
        //              "batched".
        //
        //              But, if we're only changing a small number of nodes, we might no want to buffer at all.
        //              The higher numbers mean that even small changes will result in buffering.
        //              Each higher level includes the lower levels.
        NODE: 1, // If a node changes, implement buffering
        ATTRIBUTE: 2, // If an attribute or node changes, implement buffering
        TEXT: 3 // If any text at all changes, implement buffering
}
dojox.dtl.render.html.Render = function(/*DOMNode?*/ attachPoint, /*dojox.dtl.HtmlTemplate?*/ tpl){
        this._tpl = tpl;
        this._node = attachPoint;
        this._swap = dojo.hitch(this, function(){
                // summary: Swaps the node out the first time the DOM is changed
                // description: Gets swapped back it at end of render
                if(this._node === this._tpl.getRootNode()){
                        var frag = this._node;
                        this._node = this._node.cloneNode(true);
                        frag.parentNode.replaceChild(this._node, frag);
                }
        });
}
dojo.extend(dojox.dtl.render.html.Render, {
        sensitivity: dojox.dtl.render.html.sensitivity,
        setAttachPoint: function(/*Node*/ node){
                this._node = node;
        },
        render: function(/*dojox.dtl.HtmlTemplate*/ tpl, /*Object*/ context, /*dojox.dtl.HtmlBuffer?*/ buffer){
                if(!this._node){
                        throw new Error("You cannot use the Render object without specifying where you want to render it");
                }

                buffer = buffer || tpl.getBuffer();

                if(context.getThis() && context.getThis().buffer == this.sensitivity.NODE){
                        var onAddNode = dojo.connect(buffer, "onAddNode", this, "_swap");
                        var onRemoveNode = dojo.connect(buffer, "onRemoveNode", this, "_swap");
                }

                if(this._tpl && this._tpl !== tpl){
                        this._tpl.unrender(context, buffer);
                }
                this._tpl = tpl;

                var frag = tpl.render(context, buffer).getParent();

                dojo.disconnect(onAddNode);
                dojo.disconnect(onRemoveNode);

                if(this._node !== frag){
                        this._node.parentNode.replaceChild(frag, this._node);
                        dojo._destroyElement(this._node);
                        this._node = frag;
                }
        }
});

}