Project

General

Profile

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
}
(9-9/15)