1
|
/*
|
2
|
License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
|
3
|
$Id: MergeModels.js 3881 2008-02-27 15:41:07Z gjvoosten $
|
4
|
*/
|
5
|
|
6
|
// Ensure this object's dependancies are loaded.
|
7
|
mapbuilder.loadScript(baseDir+"/tool/ToolBase.js");
|
8
|
|
9
|
/**
|
10
|
* Model that allows to merge multiple models into one. The first model
|
11
|
* determines the root node, other models are appended within the same
|
12
|
* root node.
|
13
|
* @constructor
|
14
|
* @base ToolBase
|
15
|
* @author Andreas Hocevar andreas.hocevarATgmail.com
|
16
|
* @param modelNode The model's XML object node from the configuration document
|
17
|
* @param model model this tool belongs to.
|
18
|
*/
|
19
|
function MergeModels(toolNode, model) {
|
20
|
// Inherit the ModelBase functions and parameters
|
21
|
ToolBase.apply(this, new Array(toolNode, model));
|
22
|
|
23
|
this.template = null;
|
24
|
|
25
|
this.init = function(objRef) {
|
26
|
objRef.model.mergeModels = new Array();
|
27
|
var models = toolNode.selectSingleNode('mb:merges');
|
28
|
if (models) {
|
29
|
var model = models.childNodes;
|
30
|
for (var i = 0; i < model.length; i++) {
|
31
|
if (model[i].firstChild) {
|
32
|
objRef.addModel(objRef, config.objects[getNodeValue(model[i])]);
|
33
|
}
|
34
|
}
|
35
|
}
|
36
|
}
|
37
|
// it is important to be registered before other tools that
|
38
|
// check for model.mergeModels
|
39
|
model.addListener('init', this.init, this);
|
40
|
|
41
|
this.getTemplate = function(objRef) {
|
42
|
objRef.template = objRef.model.doc ? objRef.model.doc.cloneNode(true) : null;
|
43
|
if (objRef.template) {
|
44
|
objRef.model.removeListener('loadModel', objRef.getTemplate, objRef);
|
45
|
objRef.buildModel(objRef);
|
46
|
}
|
47
|
}
|
48
|
model.addListener('loadModel', this.getTemplate, this);
|
49
|
|
50
|
this.addModel = function(objRef, model) {
|
51
|
objRef.model.mergeModels.push(model);
|
52
|
if (model.doc) {
|
53
|
objRef.mergeModel(objRef, model.doc);
|
54
|
}
|
55
|
model.addListener('refresh', objRef.buildModel, objRef);
|
56
|
}
|
57
|
|
58
|
this.mergeModel = function(objRef, modelToMerge) {
|
59
|
var docToMerge = modelToMerge.doc ? modelToMerge.doc.cloneNode(true) : null;
|
60
|
var nodes = docToMerge ? docToMerge.selectNodes('//*[@fid]') : null;
|
61
|
if (!nodes) return;
|
62
|
var node;
|
63
|
for (var i=0; i<nodes.length; i++) {
|
64
|
node = nodes[i];
|
65
|
if (node.nodeName) {
|
66
|
node.setAttribute('sourceModel', modelToMerge.id);
|
67
|
}
|
68
|
}
|
69
|
Sarissa.copyChildNodes(docToMerge.documentElement, objRef.model.doc.documentElement, true);
|
70
|
}
|
71
|
|
72
|
this.buildModel = function(objRef) {
|
73
|
if (!objRef.template) return;
|
74
|
objRef.model.callListeners('newModel');
|
75
|
objRef.model.doc = objRef.template.cloneNode(true);
|
76
|
for (var i=0; i<objRef.model.mergeModels.length; i++) {
|
77
|
objRef.mergeModel(objRef, objRef.model.mergeModels[i]);
|
78
|
}
|
79
|
objRef.model.callListeners('loadModel');
|
80
|
}
|
81
|
}
|