dojox
Version:
Dojo eXtensions, a rollup of many useful sub-projects and varying states of maturity – from very stable and robust, to alpha and experimental. See individual projects contain README files for details.
226 lines (182 loc) • 5.16 kB
JavaScript
define([
"dojo/_base/declare",
"dojo/_base/array",
"dojo/_base/html",
"dojo/_base/lang",
"dojo/dom-class",
"dojo/dom-style",
"dojo/Stateful",
"dojo/Evented"],
function(
declare,
arr,
html,
lang,
domClass,
domStyle,
Stateful,
Evented,
when){
return declare("dojox.calendar.RendererManager", [Stateful, Evented], {
// summary:
// This mixin contains the store management.
// owner: Object
// The owner of the store manager: a view or a calendar widget.
owner: null,
// rendererPool: [protected] Array
// The stack of recycled renderers available.
rendererPool: null,
// rendererList: [protected] Array
// The list of used renderers
rendererList: null,
// itemToRenderer: [protected] Object
// The associated array item to renderer list.
itemToRenderer: null,
constructor: function(/*Object*/ args){
args = args || {};
this.rendererPool = [];
this.rendererList = [];
this.itemToRenderer = {};
},
destroy: function(){
while(this.rendererList.length > 0){
this.destroyRenderer(this.rendererList.pop());
}
for(var kind in this._rendererPool){
var pool = this._rendererPool[kind];
if(pool){
while(pool.length > 0){
this.destroyRenderer(pool.pop());
}
}
}
},
recycleItemRenderers: function(remove){
// summary:
// Recycles all the item renderers.
// remove: Boolean
// Whether remove the DOM node from it parent.
// tags:
// protected
while(this.rendererList.length>0){
var ir = this.rendererList.pop();
this.recycleRenderer(ir, remove);
}
this.itemToRenderer = {};
},
getRenderers: function(item){
// summary:
// Returns the renderers that are currently used to displayed the speficied item.
// Returns an array of objects that contains two properties:
// - container: The DOM node that contains the renderer.
// - renderer: The dojox.calendar._RendererMixin instance.
// Do not keep references on the renderers are they are recycled and reused for other items.
// item: Object
// The data or render item.
// returns: Object[]
if(item == null || item.id == null){
return null;
}
var list = this.itemToRenderer[item.id];
return list == null ? null : list.concat();
},
createRenderer: function(item, kind, rendererClass, cssClass){
// summary:
// Creates an item renderer of the specified kind. A renderer is an object with the "container" and "instance" properties.
// item: Object
// The data item.
// kind: String
// The kind of renderer.
// rendererClass: Object
// The class to instantiate to create the renderer.
// returns: Object
// tags:
// protected
if(item != null && kind != null && rendererClass != null){
var res=null, renderer=null;
var pool = this.rendererPool[kind];
if(pool != null){
res = pool.shift();
}
if (res == null){
renderer = new rendererClass;
res = {
renderer: renderer,
container: renderer.domNode,
kind: kind
};
this.emit("rendererCreated", {renderer:res, source:this.owner, item:item});
} else {
renderer = res.renderer;
this.emit("rendererReused", {renderer:renderer, source:this.owner, item:item});
}
renderer.owner = this.owner;
renderer.set("rendererKind", kind);
renderer.set("item", item);
var list = this.itemToRenderer[item.id];
if (list == null) {
this.itemToRenderer[item.id] = list = [];
}
list.push(res);
this.rendererList.push(res);
return res;
}
return null;
},
recycleRenderer: function(renderer, remove){
// summary:
// Recycles the item renderer to be reused in the future.
// renderer: dojox/calendar/_RendererMixin
// The item renderer to recycle.
// tags:
// protected
this.emit("rendererRecycled", {renderer:renderer, source:this.owner});
var pool = this.rendererPool[renderer.kind];
if(pool == null){
this.rendererPool[renderer.kind] = [renderer];
}else{
pool.push(renderer);
}
if(remove){
renderer.container.parentNode.removeChild(renderer.container);
}
domStyle.set(renderer.container, "display", "none");
renderer.renderer.owner = null;
renderer.renderer.set("item", null);
},
destroyRenderer: function(renderer){
// summary:
// Destroys the item renderer.
// renderer: dojox/calendar/_RendererMixin
// The item renderer to destroy.
// tags:
// protected
this.emit("rendererDestroyed", {renderer:renderer, source:this.owner});
var ir = renderer.renderer;
if(ir["destroy"]){
ir.destroy();
}
html.destroy(renderer.container);
},
destroyRenderersByKind: function(kind){
// tags:
// private
var list = [];
for(var i=0;i<this.rendererList.length;i++){
var ir = this.rendererList[i];
if(ir.kind == kind){
this.destroyRenderer(ir);
}else{
list.push(ir);
}
}
this.rendererList = list;
var pool = this.rendererPool[kind];
if(pool){
while(pool.length > 0){
this.destroyRenderer(pool.pop());
}
}
}
});
});