/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license. * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full * text of the license. */ // @require: OpenLayers/Control.js /** * @class */ OpenLayers.Control.LayerSwitcher = Class.create(); /** color used in the UI to show a layer is active/displayed * * @final * @type String */ OpenLayers.Control.LayerSwitcher.ACTIVE_COLOR = "darkblue"; /** color used in the UI to show a layer is deactivated/hidden * * @final * @type String */ OpenLayers.Control.LayerSwitcher.NONACTIVE_COLOR = "lightblue"; OpenLayers.Control.LayerSwitcher.prototype = Object.extend( new OpenLayers.Control(), { /** @type String */ activeColor: "", /** @type String */ nonActiveColor: "", /** @type String */ mode: "checkbox", /** * @constructor */ initialize: function(options) { this.activeColor = OpenLayers.Control.LayerSwitcher.ACTIVE_COLOR; this.nonActiveColor = OpenLayers.Control.LayerSwitcher.NONACTIVE_COLOR; this.backdrops = []; OpenLayers.Control.prototype.initialize.apply(this, arguments); }, /** * @returns A reference to the DIV DOMElement containing the switcher tabs * @type DOMElement */ draw: function() { // initialize our internal div OpenLayers.Control.prototype.draw.apply(this); this.div.style.position = "absolute"; this.div.style.top = "10px"; this.div.style.right = "0px"; this.div.style.left = ""; this.div.style.fontFamily = "sans-serif"; this.div.style.color = "white"; this.div.style.fontWeight = "bold"; this.div.style.marginTop = "3px"; this.div.style.marginLeft = "3px"; this.div.style.marginBottom = "3px"; this.div.style.fontSize="smaller"; this.div.style.width = "10em"; this.map.events.register("addlayer", this, this.redraw); this.map.events.register("removelayer", this, this.redraw); return this.redraw(); }, /** * @returns A reference to the DIV DOMElement containing the switcher tabs * @type DOMElement */ redraw: function() { //clear out previous incarnation of LayerSwitcher tabs this.div.innerHTML = ""; var visible = false; for( var i = 0; i < this.map.layers.length; i++) { if (visible && this.mode == "radio") { this.map.layers[i].setVisibility(false); } else { visible = this.map.layers[i].getVisibility(); } this.addTab(this.map.layers[i]); } return this.div; }, /** * @param {event} evt */ singleClick: function(evt) { var div = Event.element(evt); // See comment about OL #57 fix below. // If the click occurred on the corner spans we need // to make sure we act on the actual label tab instead. div = div.labelElement || div; var layer = div.layer; if (this.mode == "radio") { for(var i=0; i < this.backdrops.length; i++) { this.setTabActivation(this.backdrops[i], false); this.backdrops[i].layer.setVisibility(false); } this.setTabActivation(div, true); layer.setVisibility(true); } else { var visible = layer.getVisibility(); this.setTabActivation(div, !visible); layer.setVisibility(!visible); } Event.stop(evt); }, /** * @private * * @param {event} evt */ ignoreEvent: function(evt) { Event.stop(evt); return false; }, /** * @private * * @param {OpenLayers.Layer} layer */ addTab: function(layer) { // Outer DIV - for Rico Corners // var backdropLabelOuter = document.createElement('div'); backdropLabelOuter.id = "LayerSwitcher_" + layer.name + "_Tab"; backdropLabelOuter.style.marginTop = "4px"; backdropLabelOuter.style.marginBottom = "4px"; this._setEventHandlers(backdropLabelOuter); // Inner Label - for Rico Corners // var backdropLabel = document.createElement('p'); backdropLabel.innerHTML = layer.name; backdropLabel.style.marginTop = "0px"; backdropLabel.style.marginBottom = "0px"; backdropLabel.style.paddingLeft = "10px"; backdropLabel.style.paddingRight = "10px"; // add reference to layer onto the div for use in event handlers backdropLabel.layer = layer; // set event handlers this._setEventHandlers(backdropLabel); // add label to div backdropLabelOuter.appendChild(backdropLabel); this.backdrops.append(backdropLabel); // add div to main LayerSwitcher Div this.div.appendChild(backdropLabelOuter); Rico.Corner.round(backdropLabelOuter, {corners: "tl bl", bgColor: "transparent", color: "white", blend: false}); // extend the event handlers to operate on the // rounded corners as well. (Fixes OL #57.) var spanElements=backdropLabel.parentNode.getElementsByTagName("span"); for (var currIdx = 0; currIdx < spanElements.length; currIdx++) { this._setEventHandlers(spanElements[currIdx], backdropLabel); } this.setTabActivation(backdropLabel, layer.getVisibility()); }, /* @private @param {DOMElement} div @param {Boolean} activate */ _setEventHandlers : function(element, labelDiv) { // We only want to respond to a mousedown event. element.onclick = this.singleClick.bindAsEventListener(this); element.ondblclick = this.singleClick.bindAsEventListener(this); element.onmouseup = this.ignoreEvent.bindAsEventListener(this); element.onmousedown = this.ignoreEvent.bindAsEventListener(this); // If we are operating on a corner span we need to store a // reference to the actual tab. (See comment about OL #57 fix above.) if (labelDiv) { element.labelElement = labelDiv; } }, /** * @private * * @param {DOMElement} div * @param {Boolean} activate */ setTabActivation:function(div, activate) { var color = (activate) ? this.activeColor : this.nonActiveColor; Rico.Corner.changeColor(div, color); }, /** @final @type String */ CLASS_NAME: "OpenLayers.Control.LayerSwitcher" });