1 | /* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for |
---|
2 | * full list of contributors). Published under the Clear BSD license. |
---|
3 | * See http://svn.openlayers.org/trunk/openlayers/license.txt for the |
---|
4 | * full text of the license. */ |
---|
5 | |
---|
6 | /** |
---|
7 | * @requires OpenLayers/Layer/Vector.js |
---|
8 | */ |
---|
9 | |
---|
10 | /** |
---|
11 | * Class: OpenLayers.Layer.Vector.RootContainer |
---|
12 | * A special layer type to combine multiple vector layers inside a single |
---|
13 | * renderer root container. This class is not supposed to be instantiated |
---|
14 | * from user space, it is a helper class for controls that require event |
---|
15 | * processing for multiple vector layers. |
---|
16 | * |
---|
17 | * Inherits from: |
---|
18 | * - <OpenLayers.Layer.Vector> |
---|
19 | */ |
---|
20 | OpenLayers.Layer.Vector.RootContainer = OpenLayers.Class(OpenLayers.Layer.Vector, { |
---|
21 | |
---|
22 | /** |
---|
23 | * Property: displayInLayerSwitcher |
---|
24 | * Set to false for this layer type |
---|
25 | */ |
---|
26 | displayInLayerSwitcher: false, |
---|
27 | |
---|
28 | /** |
---|
29 | * APIProperty: layers |
---|
30 | * Layers that are attached to this container. Required config option. |
---|
31 | */ |
---|
32 | layers: null, |
---|
33 | |
---|
34 | /** |
---|
35 | * Constructor: OpenLayers.Layer.Vector.RootContainer |
---|
36 | * Create a new root container for multiple vector layer. This constructor |
---|
37 | * is not supposed to be used from user space, it is only to be used by |
---|
38 | * controls that need feature selection across multiple vector layers. |
---|
39 | * |
---|
40 | * Parameters: |
---|
41 | * name - {String} A name for the layer |
---|
42 | * options - {Object} Optional object with non-default properties to set on |
---|
43 | * the layer. |
---|
44 | * |
---|
45 | * Required options properties: |
---|
46 | * layers - {Array(<OpenLayers.Layer.Vector>)} The layers managed by this |
---|
47 | * container |
---|
48 | * |
---|
49 | * Returns: |
---|
50 | * {<OpenLayers.Layer.Vector.RootContainer>} A new vector layer root |
---|
51 | * container |
---|
52 | */ |
---|
53 | initialize: function(name, options) { |
---|
54 | OpenLayers.Layer.Vector.prototype.initialize.apply(this, arguments); |
---|
55 | }, |
---|
56 | |
---|
57 | /** |
---|
58 | * Method: display |
---|
59 | */ |
---|
60 | display: function() {}, |
---|
61 | |
---|
62 | /** |
---|
63 | * Method: getFeatureFromEvent |
---|
64 | * walk through the layers to find the feature returned by the event |
---|
65 | * |
---|
66 | * Parameters: |
---|
67 | * evt - {Object} event object with a feature property |
---|
68 | * |
---|
69 | * Returns: |
---|
70 | * {<OpenLayers.Feature.Vector>} |
---|
71 | */ |
---|
72 | getFeatureFromEvent: function(evt) { |
---|
73 | var layers = this.layers; |
---|
74 | var feature; |
---|
75 | for(var i=0; i<layers.length; i++) { |
---|
76 | feature = layers[i].getFeatureFromEvent(evt); |
---|
77 | if(feature) { |
---|
78 | return feature; |
---|
79 | } |
---|
80 | } |
---|
81 | }, |
---|
82 | |
---|
83 | /** |
---|
84 | * Method: setMap |
---|
85 | * |
---|
86 | * Parameters: |
---|
87 | * map - {<OpenLayers.Map>} |
---|
88 | */ |
---|
89 | setMap: function(map) { |
---|
90 | OpenLayers.Layer.Vector.prototype.setMap.apply(this, arguments); |
---|
91 | this.collectRoots(); |
---|
92 | map.events.register("changelayer", this, this.handleChangeLayer); |
---|
93 | }, |
---|
94 | |
---|
95 | /** |
---|
96 | * Method: removeMap |
---|
97 | * |
---|
98 | * Parameters: |
---|
99 | * map - {<OpenLayers.Map>} |
---|
100 | */ |
---|
101 | removeMap: function(map) { |
---|
102 | map.events.unregister("changelayer", this, this.handleChangeLayer); |
---|
103 | this.resetRoots(); |
---|
104 | OpenLayers.Layer.Vector.prototype.removeMap.apply(this, arguments); |
---|
105 | }, |
---|
106 | |
---|
107 | /** |
---|
108 | * Method: collectRoots |
---|
109 | * Collects the root nodes of all layers this control is configured with |
---|
110 | * and moveswien the nodes to this control's layer |
---|
111 | */ |
---|
112 | collectRoots: function() { |
---|
113 | var layer; |
---|
114 | // walk through all map layers, because we want to keep the order |
---|
115 | for(var i=0; i<this.map.layers.length; ++i) { |
---|
116 | layer = this.map.layers[i]; |
---|
117 | if(OpenLayers.Util.indexOf(this.layers, layer) != -1) { |
---|
118 | layer.renderer.moveRoot(this.renderer); |
---|
119 | } |
---|
120 | } |
---|
121 | }, |
---|
122 | |
---|
123 | /** |
---|
124 | * Method: resetRoots |
---|
125 | * Resets the root nodes back into the layers they belong to. |
---|
126 | */ |
---|
127 | resetRoots: function() { |
---|
128 | var layer; |
---|
129 | for(var i=0; i<this.layers.length; ++i) { |
---|
130 | layer = this.layers[i]; |
---|
131 | if(this.renderer && layer.renderer.getRenderLayerId() == this.id) { |
---|
132 | this.renderer.moveRoot(layer.renderer); |
---|
133 | } |
---|
134 | } |
---|
135 | }, |
---|
136 | |
---|
137 | /** |
---|
138 | * Method: handleChangeLayer |
---|
139 | * Event handler for the map's changelayer event. We need to rebuild |
---|
140 | * this container's layer dom if order of one of its layers changes. |
---|
141 | * This handler is added with the setMap method, and removed with the |
---|
142 | * removeMap method. |
---|
143 | * |
---|
144 | * Parameters: |
---|
145 | * evt - {Object} |
---|
146 | */ |
---|
147 | handleChangeLayer: function(evt) { |
---|
148 | var layer = evt.layer; |
---|
149 | if(evt.property == "order" && |
---|
150 | OpenLayers.Util.indexOf(this.layers, layer) != -1) { |
---|
151 | this.resetRoots(); |
---|
152 | this.collectRoots(); |
---|
153 | } |
---|
154 | }, |
---|
155 | |
---|
156 | CLASS_NAME: "OpenLayers.Layer.Vector.RootContainer" |
---|
157 | }); |
---|