Files
Chamilo/plugin/mindmap/edit-mindmap/vendor/js/composition.js
2025-08-14 22:39:38 +02:00

197 lines
4.1 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('events.EventTarget');
kampfer.provide('Composition');
/**
* 实现一个composition模式的类用于组织对象协调对象的关系。
* 涉及parent的方法(get,set)只会影响到实例对象本身而涉及child的方法不仅会影响对象自己
* 还会影响child实例对象。所以请使用child相关方法维护对象间的组织关系。
*/
kampfer.Composition = kampfer.events.EventTarget.extend({
//initializer : function() {},
//Composition实例
_parent : null,
//对象每一项都应该是Composition实例
_children : null,
_childrenCount : 0,
_id : null,
setId : function(id) {
var oldId = this._id;
this._id = id;
if(this._parent && this._parent._children) {
//this._parent._children[oldId] = null;
delete _parent._children[oldId];
this._parent.addChild(this);
}
},
getId : function() {
return this._id || ( this._id = this.generateUniqueId() );
},
/**
* 设置父对象。不能将parent设置为composition自己。
* 以下情况setParent将抛出异常
* 1. parent非null但不是一个composition实例
* 2. 尝试将parent设置为composition自己
* 3. parent非null且composition已经拥有了一个_parent且_parent!=parent
* @param {kampfer.mindMap.Composition}parent
*/
setParent : function(parent) {
if( parent && !(parent instanceof kampfer.Composition) ) {
throw('parent is not instanceof composition');
}
if( parent === this ) {
throw('parent cant be composition itself');
}
//如果parent已经存在
if( parent && this._parent && this._parent !== parent ) {
throw('parent already exist');
}
this.setParentEventTarget(parent);
this._parent = parent;
if( parent && !parent.getChild(this._id) ) {
parent.addChild(this);
}
},
getParent : function() {
return this._parent;
},
/**
* 添加子对象。
* @param {kampfer.mindMap.Composition} child
*/
addChild : function(child) {
if( !(child instanceof kampfer.Composition) ) {
throw('wrong type param');
}
var id = child.getId();
if(!this._children) {
this._children = {};
}
if(!this._children[id]) {
this._children[id] = child;
this._childrenCount++;
}else{
throw('can not add child');
}
if(child._parent !== this) {
child.setParent(this);
}
},
/**
* 删除子对象
* @param {string|kampfer.mindMap.Composition} child
*/
removeChild : function(child) {
if(child) {
var id, type = kampfer.type(child);
if(type === 'string') {
id = child;
child = this.getChild(id);
} else if(type === 'object') {
if( !(child instanceof kampfer.Composition) ) {
throw('wrong type param');
}
id = child.getId();
}
if(id && (id in this._children)) {
//this._children[id] = null;
delete this._children[id];
this._childrenCount--;
child.setParent(null);
}
if( this.hasNoChild() ) {
//this._children = null;
delete this._children;
}
}
return child;
},
getChild : function(id) {
var node;
this.eachChild(function(child, cid) {
if(cid === id) {
node = child;
return false;
}else {
child.eachChild(arguments.callee);
}
});
return node;
},
//fn(child, id)
eachChild : function(fn, context) {
if(this._children) {
for(var id in this._children) {
if( this._children[id] && fn.call( context, this._children[id], id ) === false ) {
return;
}
}
}
},
getChildrenCount : function() {
return this._childrenCount;
},
hasNoChild : function() {
if(this._childrenCount === 0) {
return true;
}
return false;
},
/*
* 生成唯一id
* 直接使用时间戳不可行
* 以下方法摘自http://www.cnblogs.com/NoRoad/archive/2010/03/12/1684759.html
*/
generateUniqueId : function() {
var guid = "";
for(var i = 1; i <= 32; i++) {
var n = Math.floor(Math.random() * 16.0).toString(16);
guid += n;
if((i == 8) || (i == 12) || (i == 16) || (i == 20)) {
guid += "-";
}
}
return guid;
},
dispose : function() {
kampfer.Composition.superClass.dispose.apply(this);
this._parent = null;
this._children = null;
}
});