Files
Chamilo/plugin/mindmap/edit-mindmap/vendor/js/component.js
2025-04-10 12:36:07 +02:00

165 lines
3.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*global kampfer*/
kampfer.require('Composition');
kampfer.require('dom');
kampfer.provide('Component');
kampfer.Component = kampfer.Composition.extend({
initializer : function() {
this._wasDecorated = false;
this._inDocument = false;
},
_element : null,
_doc : kampfer.global.document,
_wasDecorated : null,
_inDocument : null,
addChild : function(child, render) {
kampfer.Component.superClass.addChild.apply(this, arguments);
if(child._inDocument && this._inDocument) {
//如果父子component都在文档流中那么将子component剪切到父component
this._element.appendChild( child.getElement() );
} else if(render) {
//如果需要渲染子component那么先确保父component已经生成了dom对象
//注意:这是个强制行为
if(!this._element) {
this.createDom();
}
child.render();
} else if(!child._inDocument && this._inDocument) {
//如果子component不在文档流中而父component在。那么如果子component已生成了dom对象
//就将子component插入文档流
if( child.getElement() ) {
child.enterDocument();
}
}
},
removeChild : function(child, unrender) {
child = kampfer.Component.superClass.removeChild.apply(this, arguments);
if(unrender) {
child.exitDocument();
var childElement = child.getElement();
if(child.childElement) {
child.childElement.parentNode.removeChild(child.childElement);
}
}
},
isInDocument : function() {
return this._inDocument;
},
wasDecorated : function() {
return this._wasDecorated;
},
render : function(parent) {
if(!this._inDocument) {
if(!this._element) {
this.createDom();
}
this.enterDocument(parent);
this.decorate();
this.eachChild(function(child) {
child.render();
});
}
},
createDom : function() {
this._element = this._doc.createElement('div');
},
getElement : function() {
return this._element;
},
/* 子类应该重写这个方法 */
decorate : function() {
if(!this._inDocument) {
throw ('component not in document');
}
this._wasDecorated = true;
},
enterDocument : function(parent) {
this._inDocument = true;
if(parent && parent.nodeType) {
parent.appendChild(this._element);
} else if( this._parent && this._parent.getElement() ) {
this._parent.getElement().appendChild(this._element);
} else {
this._doc.body.appendChild(this._element);
}
},
exitDocument : function() {
//if( this._parent && this._parent.getElement() ) {
// this._parent.getElement().removeChild(this._element);
//} else {
// this._doc.body.removeChild(this._element);
//}
this._element.parentNode.removeChild(this._element);
this._inDocument = false;
},
getPosition : function() {
if(this._element) {
return {
left : parseInt( kampfer.dom.getStyle(this._element, 'left'), 10 ),
top : parseInt( kampfer.dom.getStyle(this._element, 'top'), 10 )
};
}
},
setPosition : function(left, top) {
if(this._element) {
//kampfer.style.setStyle(this._element, {
// left : left + 'px',
// top : top + 'px'
//});
this._element.style.left = left + 'px';
this._element.style.top = top + 'px';
}
},
show : function() {
if(this._element) {
this.dispatch('beforeshow');
this._element.style.display = 'block';
}
},
hide : function() {
if(this._element) {
this.dispatch('beforehide');
this._element.style.display = 'none';
}
},
getSize : function() {
if(this._inDocument) {
return {
width : this._element.offsetWidth,
height : this._element.offsetHeight
};
}
},
dispose : function() {
kampfer.Component.superClass.dispose.apply(this);
}
});