The new layer switcher behaves the same as the standard one but has less cruft and more attractive styling.
175 lines
5.4 KiB
JavaScript
175 lines
5.4 KiB
JavaScript
var SimpleLayerSwitcher = OpenLayers.Class(OpenLayers.Control, {
|
|
layerStates: null,
|
|
layersDiv: null,
|
|
ascending: true,
|
|
|
|
initialize: function(options) {
|
|
OpenLayers.Control.prototype.initialize.apply(this, arguments);
|
|
this.layerStates = [];
|
|
},
|
|
|
|
destroy: function() {
|
|
OpenLayers.Event.stopObservingElement(this.div);
|
|
|
|
//clear out layers info and unregister their events
|
|
this.map.events.un({
|
|
"addlayer": this.redraw,
|
|
"changelayer": this.redraw,
|
|
"removelayer": this.redraw,
|
|
"changebaselayer": this.redraw,
|
|
scope: this
|
|
});
|
|
OpenLayers.Control.prototype.destroy.apply(this, arguments);
|
|
},
|
|
|
|
setMap: function(map) {
|
|
OpenLayers.Control.prototype.setMap.apply(this, arguments);
|
|
|
|
this.map.events.on({
|
|
"addlayer": this.redraw,
|
|
"changelayer": this.redraw,
|
|
"removelayer": this.redraw,
|
|
"changebaselayer": this.redraw,
|
|
scope: this
|
|
});
|
|
},
|
|
|
|
draw: function() {
|
|
OpenLayers.Control.prototype.draw.apply(this);
|
|
this.loadContents();
|
|
this.redraw();
|
|
return this.div;
|
|
},
|
|
|
|
checkRedraw: function() {
|
|
var redraw = false;
|
|
if ( !this.layerStates.length ||
|
|
(this.map.layers.length != this.layerStates.length) ) {
|
|
redraw = true;
|
|
} else {
|
|
for (var i=0, len=this.layerStates.length; i<len; i++) {
|
|
var layerState = this.layerStates[i];
|
|
var layer = this.map.layers[i];
|
|
if ( (layerState.name != layer.name) ||
|
|
(layerState.inRange != layer.inRange) ||
|
|
(layerState.id != layer.id) ||
|
|
(layerState.visibility != layer.visibility) ) {
|
|
redraw = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return redraw;
|
|
},
|
|
|
|
redraw: function() {
|
|
if (!this.checkRedraw()) {
|
|
return this.div;
|
|
}
|
|
|
|
this.div.innerHTML = '';
|
|
var len = this.map.layers.length;
|
|
this.layerStates = [];
|
|
for (var i = 0; i < this.map.layers.length; i++) {
|
|
var layer = this.map.layers[i];
|
|
this.layerStates[i] = {
|
|
'name': layer.name,
|
|
'visibility': layer.visibility,
|
|
'inRange': layer.inRange,
|
|
'id': layer.id
|
|
};
|
|
}
|
|
|
|
var layers = this.map.layers.slice();
|
|
if (!this.ascending) { layers.reverse(); }
|
|
for (var i = 0; i < layers.length; i++) {
|
|
var layer = layers[i];
|
|
var baseLayer = layer.isBaseLayer;
|
|
|
|
if (layer.displayInLayerSwitcher && baseLayer) {
|
|
var on = (baseLayer) ? (layer == this.map.baseLayer)
|
|
: layer.getVisibility();
|
|
var layerElem = document.createElement('a');
|
|
layerElem.id = this.id + '_input_' + layer.name;
|
|
layerElem.innerHTML = layer.name;
|
|
layerElem.href = '#';
|
|
|
|
OpenLayers.Element.addClass(layerElem, 'basey');
|
|
OpenLayers.Element.addClass(layerElem,
|
|
'basey-' + (on ? 'on' : 'off'));
|
|
|
|
if (!baseLayer && !layer.inRange) {
|
|
layerElem.disabled = true;
|
|
}
|
|
var context = {
|
|
'layer': layer
|
|
};
|
|
OpenLayers.Event.observe(layerElem, 'mouseup',
|
|
OpenLayers.Function.bindAsEventListener(
|
|
this.onInputClick,
|
|
context)
|
|
);
|
|
|
|
this.div.appendChild(layerElem);
|
|
}
|
|
}
|
|
|
|
return this.div;
|
|
},
|
|
|
|
onInputClick: function(e) {
|
|
if (this.layer.isBaseLayer) {
|
|
this.layer.map.setBaseLayer(this.layer);
|
|
} else {
|
|
this.layer.setVisibility(!this.layer.getVisibility());
|
|
}
|
|
OpenLayers.Event.stop(e);
|
|
},
|
|
|
|
updateMap: function() {
|
|
|
|
// set the newly selected base layer
|
|
for(var i=0, len=this.baseLayers.length; i<len; i++) {
|
|
var layerEntry = this.baseLayers[i];
|
|
if (layerEntry.inputElem.checked) {
|
|
this.map.setBaseLayer(layerEntry.layer, false);
|
|
}
|
|
}
|
|
|
|
// set the correct visibilities for the overlays
|
|
for(var i=0, len=this.dataLayers.length; i<len; i++) {
|
|
var layerEntry = this.dataLayers[i];
|
|
layerEntry.layer.setVisibility(layerEntry.inputElem.checked);
|
|
}
|
|
|
|
},
|
|
|
|
loadContents: function() {
|
|
//configure main div
|
|
OpenLayers.Event.observe(this.div, 'mouseup',
|
|
OpenLayers.Function.bindAsEventListener(this.mouseUp, this));
|
|
OpenLayers.Event.observe(this.div, 'click',
|
|
this.ignoreEvent);
|
|
OpenLayers.Event.observe(this.div, 'mousedown',
|
|
OpenLayers.Function.bindAsEventListener(this.mouseDown, this));
|
|
OpenLayers.Event.observe(this.div, 'dblclick', this.ignoreEvent);
|
|
},
|
|
|
|
ignoreEvent: function(evt) {
|
|
OpenLayers.Event.stop(evt);
|
|
},
|
|
|
|
mouseDown: function(evt) {
|
|
this.isMouseDown = true;
|
|
this.ignoreEvent(evt);
|
|
},
|
|
|
|
mouseUp: function(evt) {
|
|
if (this.isMouseDown) {
|
|
this.isMouseDown = false;
|
|
this.ignoreEvent(evt);
|
|
}
|
|
},
|
|
|
|
CLASS_NAME: "SimpleLayerSwitcher"
|
|
});
|