/*---------------- FILE HEADER --------------------------------------- This file is part of Geoide. Copyright (C) 2005-2006 by: IDgis B.V. http://www.idgis.nl This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Contact: Herman Assink IDgis bv P.O. Box 15 7450 AA Holten The Netherlands E-Mail: herman.assink@idgis.nl * @version 1.4.0 * @author IDgis team * ------------------------------------------------------------------------*/ import nl.idgis.giclient.gui.ContainerContent; import nl.idgis.giclient.gis.ActiveMapListener; import nl.idgis.giclient.gis.Layer; import nl.idgis.giclient.gis.LayerExpandedListener; import nl.idgis.giclient.gis.SelectionListener; import nl.idgis.giclient.gis.ShuffleListener; import nl.idgis.giclient.gis.ZoomListener; import nl.idgis.giclient.gui.legendviewer.LegendLayer; import nl.idgis.giclient.gis.SRSChangeListener; import nl.idgis.giclient.event.StateEvent; import nl.idgis.giclient.event.StateEventListener; class nl.idgis.giclient.gui.legendviewer.LegendViewer extends ContainerContent implements StateEventListener, ActiveMapListener, SelectionListener, ZoomListener, ShuffleListener, LayerExpandedListener, SRSChangeListener { private var initWidth:Number = -1; private var initHeight:Number = -1; private var legendMapHeight:Number = 28; private var availableDepth = 0; private var lightColor:Number = 0xffffff; private var darkColor:Number = 0x404040; private var dragging:Boolean = false; private var numLoadingLegendLayers:Number = 0; private var movieClipNames:Object; function onLoad():Void { movieClipNames = new Object(); Stage.addListener(this); ruler.getGIS().gisEventDispatcher.addActiveMapListener(this); ruler.getGIS().gisEventDispatcher.addZoomListener(this); ruler.getGIS().gisEventDispatcher.addShuffleListener(this); ruler.getGIS().gisEventDispatcher.addSRSChangeListener(this); ruler.addEventListener(this, "Ruler", StateEvent.CHANGE, "context"); contentWidth = 500; initWidth = frame.width; initHeight = frame.height; var layers:Array = ruler.getGIS().getLayers(); for (var i:Number = 0; i < layers.length; i++) { layers[i].layerEventDispatcher.addLayerExpandedListener(this); } drawAll(); } function beforeChangeActiveMap():Void { var layers:Array = ruler.getGIS().getLayers(); for (var i:Number = 0; i < layers.length; i++) { layers[i].layerEventDispatcher.removeLayerExpandedListener(this); } } function clearAll():Void { for (var i:String in this) { if(this[i] instanceof MovieClip && this[i] != this._parent._parent) { this[i].removeMovieClip(); } } availableDepth = 0; } function afterChangeActiveMap():Void { var layers:Array = ruler.getGIS().getLayers(); for (var i:Number = 0; i < layers.length; i++) { layers[i].layerEventDispatcher.addLayerExpandedListener(this); } clearAll(); drawAll(); } function onChangeLayerExpanded():Void { hideLegendLayers(); showAndOrderLegendLayers(); } function onChangeLayerSelectedFeatures(layer:Layer, selected:Boolean, subSelected:Boolean, current:Boolean):Void { if (selected) { hideLegendLayers(); showAndOrderLegendLayers(); } } function onShuffle(Void):Void { showAndOrderLegendLayers(); } function onResize():Void { resizeViewer(); } function onZoom():Void { hideLegendLayers(); showAndOrderLegendLayers(); } private function movieClipName(name:String):String { if(movieClipNames[name] == null) { var split:Array = name.split("_"); var tmpName:String = split.join("__"); split = tmpName.split(":"); tmpName = split.join("_"); movieClipNames[name] = tmpName + "_legend_mc"; } return movieClipNames[name]; } private function drawAll():Void { drawLegendMap(); var layers:Array = ruler.getGIS().getLayers(); for (var i:Number = 0; i < layers.length; i++) { var layer:Layer = Layer(layers[i]); if (layer.getNoLegendLayer() == false) { numLoadingLegendLayers++; var layerName:String = layer.getMapConnector().getID() + layer.getName(); var initObject:Object = new Object(); initObject["ruler"] = ruler; initObject["layer"] = layer; initObject["viewerWidth"] = contentWidth; initObject["_visible"] = false; attachMovie("LegendLayer", movieClipName(layerName), availableDepth++, initObject); layer.layerEventDispatcher.addSelectionListener(this); } } } private function drawLegendMap():Void { var normalColor:Number = frame.getBackGroundColor(); createEmptyMovieClip("legendMap", availableDepth++); this["legendMap"].beginFill(normalColor, 80); this["legendMap"].lineStyle(1, lightColor, 100); this["legendMap"].moveTo(0, legendMapHeight - 1); this["legendMap"].lineTo(0, 0); this["legendMap"].lineTo(contentWidth - 1, 0); this["legendMap"].lineStyle(1, darkColor, 100); this["legendMap"].lineTo(contentWidth - 1, legendMapHeight - 1); this["legendMap"].lineTo(0, legendMapHeight - 1); this["legendMap"].endFill(); this["legendMap"].createEmptyMovieClip("icon", 0); this["legendMap"]["icon"].beginFill(darkColor, 80); this["legendMap"]["icon"].lineStyle(1, darkColor, 80); this["legendMap"]["icon"].moveTo(7, 11); this["legendMap"]["icon"].lineTo(10.5, 7); this["legendMap"]["icon"].lineTo(14, 11); this["legendMap"]["icon"].lineTo(10.5, legendMapHeight - 1); this["legendMap"]["icon"].endFill(); var textFormat:TextFormat = new TextFormat(); textFormat.font = "_sans"; textFormat.size = 11; //textFormat.bold = true; var mapTitle:String = ruler.getGIS().getActiveMap().getTitle(); var textFieldWidth:Number = textFormat.getTextExtent(mapTitle).textFieldWidth; var textFieldHeight:Number = textFormat.getTextExtent(mapTitle).textFieldHeight; this["legendMap"].createTextField("label", 1, 20, 5, textFieldWidth, textFieldHeight); this["legendMap"]["label"].setNewTextFormat(textFormat); this["legendMap"]["label"].text = mapTitle; } function onChangeLegendLayerHeight(legendLayer:LegendLayer):Void { if (legendLayer == this["draggingLegendLayer"]) { // ??? return; } if (numLoadingLegendLayers > 0) { numLoadingLegendLayers--; } if (numLoadingLegendLayers == 0) { hideLegendLayers(); showAndOrderLegendLayers(); } } private function hideLegendLayers():Void { var layers:Array = ruler.getGIS().getLayers(); for (var i:Number = 0; i < layers.length; i++) { var name = movieClipName(Layer(layers[i]).getMapConnector().getID() + layers[i].getName()); this[name]._visible = false; this[name]._x = 0; this[name]._y = 0; } } private function showAndOrderLegendLayers():Void { var zoomVisibleExpandedLayers:Array = ruler.getGIS().getActiveMap().getDisableInvisible() ? ruler.getGIS().getExpandedLayers() : ruler.getGIS().getZoomVisibleExpandedLayers(); var layer:Layer = null; var layerName:String = ""; var yPos:Number = legendMapHeight; var first:Boolean = true; var currentScale:Number = ruler.getGIS().getCurrentScale(); for (var i:Number = 0; i < zoomVisibleExpandedLayers.length; i++) { layer = zoomVisibleExpandedLayers[i]; layerName = movieClipName(layer.getMapConnector().getID() + layer.getName()); var legendLayer:LegendLayer = LegendLayer(this[layerName]); legendLayer._y = yPos; legendLayer._x = 0; legendLayer.display(); if(ruler.getGIS().isZoomVisibleLayer(layer)) { legendLayer.enable(); } else { legendLayer.disable(); } yPos += legendLayer.getHeight(); } contentHeight = yPos + 6; resizeViewer(); _parent.refreshPane(); } private function resizeViewer():Void { if (contentHeight + 15 > Stage.height - 100) { frame.setSize(frame.width, Stage.height - 100); } else { frame.setSize(frame.width, contentHeight + 15); } } function onClickLegendLayerArrow(layer:Layer, direction:String) { // Finds all zoomvisible sibling layers. Sibling layers have the same superlayer. These are required because shuffling with the arrows can only be done within the context of the same map or superlayer. var zoomVisibleExpandedLayers:Array = ruler.getGIS().getZoomVisibleExpandedLayers(); var zoomVisibleSiblingLayers:Array = new Array(); for (var i:Number = 0; i < zoomVisibleExpandedLayers.length; i++) { if (zoomVisibleExpandedLayers[i].getSuperLayer() == layer.getSuperLayer()) { zoomVisibleSiblingLayers.push(zoomVisibleExpandedLayers[i]); } } // Finds the sibling layer that needs to be moved to. Cannot use GIS.zoomFrontward() or GIS.zoomBackward(), because those methods don't consider zoomvisibility. var i:Number = 0; var toLayer:Layer = null; while (zoomVisibleSiblingLayers[i] != layer) { i++; } if ((direction == "Frontward") && (zoomVisibleSiblingLayers.length > 1) && (i > 0)) { toLayer = zoomVisibleSiblingLayers[i - 1]; } else if ((direction == "Backward") && (i < zoomVisibleSiblingLayers.length - 1)) { toLayer = zoomVisibleSiblingLayers[i + 1]; } // Calls the gis to do the actual shuffling. if (toLayer != null) { ruler.getGIS().moveLayerTo(layer, toLayer); } } function onStartDraggingLegendLayer(layer:Layer):Void { dragging = true; var initObject:Object = new Object(); initObject["ruler"] = ruler; initObject["layer"] = layer; initObject["viewerWidth"] = contentWidth; this.attachMovie("LegendLayer", "draggingLegendLayer", availableDepth++, initObject); this["draggingLegendLayer"]._x = 0; this["draggingLegendLayer"]._y = _ymouse; this["draggingLegendLayer"]._alpha = 80; } function onMouseMove():Void { if (dragging) { this["draggingLegendLayer"]._y = _ymouse; } } function onMouseUp():Void { if (dragging) { dragging = false; // Finds the layer where the "dragging legend layer" dropped. var zoomVisibleExpandedLayers:Array = ruler.getGIS().getZoomVisibleExpandedLayers(); var yPos:Number = legendMapHeight; var fromLayer:Layer = this["draggingLegendLayer"].layer; var toLayer:Layer = null; for (var i:Number = 0; i < zoomVisibleExpandedLayers.length; i++) { var currentLayer:Layer = zoomVisibleExpandedLayers[i]; yPos += this[movieClipName(currentLayer.getMapConnector().getID() + currentLayer.getName())]._height - 1; if(_ymouse <= yPos) { toLayer = zoomVisibleExpandedLayers[i]; break; } } if (toLayer == null) { toLayer = zoomVisibleExpandedLayers[zoomVisibleExpandedLayers.length - 1]; } // The found layer may be a sublayer of the layer which is actually aimed at. In that case, finds the desired superlayer. while ((toLayer.getSuperLayer() != null) && (toLayer.getSuperLayer() != fromLayer.getSuperLayer())) { toLayer = toLayer.getSuperLayer(); } // Removes the dragging legend layer. This must be done prior to calling the gis, or the redrawing will be confused. this["draggingLegendLayer"].removeMovieClip(); availableDepth--; // Calls the gis to do the actual shuffling. if ((fromLayer != toLayer) && (fromLayer.getSuperLayer() == toLayer.getSuperLayer())) { ruler.getGIS().moveLayerTo(fromLayer, toLayer); } } } function onSRSChange() : Void { var layers:Array = ruler.getGIS().getLayers(); for (var i:Number = 0; i < layers.length; i++) { var name = Layer(layers[i]).getMapConnector().getID() + layers[i].getName(); LegendLayer(this[movieClipName(name)]).setCross(); } } function onStateEvent(stateEvent:StateEvent):Void { beforeChangeActiveMap(); ruler.getGIS().gisEventDispatcher.addActiveMapListener(this); ruler.getGIS().gisEventDispatcher.addZoomListener(this); ruler.getGIS().gisEventDispatcher.addShuffleListener(this); ruler.getGIS().gisEventDispatcher.addSRSChangeListener(this); afterChangeActiveMap(); } }