/*---------------- 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.event.StateEvent; import nl.idgis.giclient.event.StateEventListener; import nl.idgis.giclient.framework.Frame; import nl.idgis.giclient.framework.SinglePaneComponent; import nl.idgis.giclient.geoma.Envelope; import nl.idgis.giclient.geoma.Point; import nl.idgis.giclient.gis.ActiveMapListener; import nl.idgis.giclient.gis.AnimationLayer; import nl.idgis.giclient.gis.CentreScale; import nl.idgis.giclient.gis.Coordinate; import nl.idgis.giclient.gis.Feature; import nl.idgis.giclient.gis.GILayer; import nl.idgis.giclient.gis.GIS; import nl.idgis.giclient.gis.LandMarksListener; import nl.idgis.giclient.gis.Layer; import nl.idgis.giclient.gis.SRSChangeListener; import nl.idgis.giclient.gis.SelectableLayer; import nl.idgis.giclient.gis.ShuffleListener; import nl.idgis.giclient.gis.TimeZoomListener; import nl.idgis.giclient.gis.ZoomListener; import nl.idgis.giclient.gui.ContainerContent; import nl.idgis.giclient.gui.mapviewer.FeatureInfoMapTip; import nl.idgis.giclient.gui.mapviewer.GeometryLayer; import nl.idgis.giclient.gui.mapviewer.MapFeature; import nl.idgis.giclient.gui.mapviewer.MapGPSSymbol; import nl.idgis.giclient.gui.mapviewer.MapLayer; import nl.idgis.giclient.gui.mapviewer.MapLayerSession; import nl.idgis.giclient.gui.mapviewer.MapUnboundFeatureLayer; import nl.idgis.giclient.io.XMLResponse; import nl.idgis.giclient.io.XMLResponseListener; import nl.idgis.giclient.modes.MapViewerSelectByGeometry; import nl.idgis.giclient.modes.Mode; import nl.idgis.giclient.util.ArrayTools; import nl.idgis.giclient.util.Pixel; import nl.idgis.giclient.util.URLTools; import nl.idgis.giclient.util.XMLTools; import nl.idgis.giclient.gis.UnboundFeatureLayer; import nl.idgis.giclient.framework.FrameWork; class nl.idgis.giclient.gui.mapviewer.MapViewer extends ContainerContent implements ActiveMapListener, ShuffleListener, ZoomListener, TimeZoomListener, LandMarksListener, XMLResponseListener, SRSChangeListener, StateEventListener { static var FRONTMOST_LAYER:Number = 0; static var ACTIVE_LAYER:Number = 1; static var EDIT_LAYER:Number = 2; static var POPUP_LAYERS:Number = 3; var mapWidth:Number = 0; var mapHeight:Number = 0; private var backGround:MovieClip = null; private var numBytesLoaded:Array = null; private var numBytesTotal:Array = null; private var numBusyMapLayers:Number = 0; var mapTipText:String = null; var xmove:Number = 0; var ymove:Number = 0; var xmouse:Number = 0; var ymouse:Number = 0; var rectX:Number = 0; //Voor het trekken van de box en het pannen var rectY:Number = 0; //--idem-- var selectDragging:Boolean = false; //Bezig een box aan het trekken var zoomDragging:Boolean = false; //Bezig een box aan het trekken var panDragging:Boolean = false; //Bezig met pannen var clickTolerance:Number = 7; private var rollingOver:Boolean = false; private var keyPressed:Boolean = false; private var mapUnboundFeatureLayer:MapUnboundFeatureLayer = null; var geometryLayer:GeometryLayer = null; var infoPopUp:SinglePaneComponent = null; private var popupDelayIntervalID:Number = 0; private var mapGPSsymbol:MapGPSSymbol; private var featureInfoMapTip:FeatureInfoMapTip; private var crossHair_mc:MovieClip = null; private var mouseMoveTimeoutId = undefined; function onLoad():Void { mapWidth = Stage.width; mapHeight = Stage.height; numBytesLoaded = new Array(); numBytesTotal = new Array(); useHandCursor = false; featureInfoMapTip = new FeatureInfoMapTip(this, ruler.getGIS()); Stage.addListener(this); Key.addListener(this); ruler.getGIS().gisEventDispatcher.addActiveMapListener(this); ruler.getGIS().gisEventDispatcher.addShuffleListener(this); ruler.getGIS().gisEventDispatcher.addZoomListener(this); ruler.getGIS().gisEventDispatcher.addTimeZoomListener(this); ruler.getGIS().gisEventDispatcher.addLandMarksListener(this); ruler.getGIS().gisEventDispatcher.addSRSChangeListener(this); ruler.addEventListener(this, "Ruler", StateEvent.CHANGE, "context"); drawAll(); } function onResize():Void { mapWidth = Stage.width; mapHeight = Stage.height; this["stigma"]._x = 0; this["stigma"]._y = mapHeight - 100; drawBackGround(); } function onKeyDown():Void { if (keyPressed == false) { keyPressed = true; ruler.getActiveMode().getAction().onKeyPress(this); } } function onKeyUp():Void { keyPressed = false; } function beforeChangeActiveMap():Void { this["customCursor"].resetInterval(); } function clearAll():Void { super.clearAll(); backGround = null; // super.clearAll() removes the backGround but doesn't reset the reference to it. } function afterChangeActiveMap():Void { clearAll(); drawAll(); } function onShuffle(Void):Void { var layers:Array = ruler.getGIS().getLayers(); var layer:Layer = null; var mapLayer:MapLayer = null; for (var i:Number = 0; i < layers.length; i++) { layer = Layer(layers[layers.length - 1 - i]); mapLayer = getMapLayer(layer); mapLayer.swapDepths(i); } } private function getMapLayers():Array { var mapLayers:Array = new Array(); var mapLayer:MapLayer = null; var layers:Array = ruler.getGIS().getLayers(); for (var i:Number = 0; i < layers.length; i++) { if(layers[i].getMapConnector() != null) { mapLayer = getMapLayer(Layer(layers[i])); mapLayers.push(mapLayer); } } return mapLayers; } function onZoom():Void { FrameWork(_root["frameWork"]).resetBusyType("mapLayer"); if(this["crossHair"]!=null){ var point:Point = Point(this["crossHair"]["point"]); var pixel : Pixel = Pixel(this.point2Pixel(point.getX(),point.getY())); this["crossHair"]._x = pixel.getX(); this["crossHair"]._y = pixel.getY(); } var mapLayers:Array = getMapLayers(); for(var i:Number = 0; i < mapLayers.length; i++) { mapLayers[i].zoom(); } drawLandMarks(); if(infoPopUp!=null){ infoPopUp.getPane().getScrollContent().drawInfoFlag(); } } function onTimeZoom():Void { FrameWork(_root["frameWork"]).resetBusyType("mapLayer"); var layers:Array = ruler.getGIS().getAnimationLayers(); var layer:Layer = null; var mapLayer:MapLayer = null; var mapAnimationLayers:Array = new Array(); for (var i:Number = 0; i < layers.length; i++) { mapLayer = getMapLayer(layer); mapAnimationLayers.push(mapLayer); } for (var i:Number = 0; i < layers.length; i++) { layer = Layer(layers[layers.length - 1 - i]); // Reversion of layers not really necessary here. mapLayer = getMapLayer(layer); mapLayer.timeZoom(null); } drawLandMarks(); if(infoPopUp!=null){ infoPopUp.getPane().getScrollContent().drawInfoFlag(); } } function onChangeLandMarks():Void { drawLandMarks(); } public function getFeatureID(movieClipName:String) { if(movieClipName.indexOf("|") != -1) { return movieClipName.split("|")[1]; } else { return movieClipName; } } private function movieClipName(name:String):String { var split:Array = name.split("_"); name = split.join("__"); split = name.split(":"); name = split.join("_"); return name; } function getMapLayer(layer:Layer):MapLayer { var mapLayer:MapLayer = null; if (layer == null) { mapLayer = null; } else if (layer instanceof UnboundFeatureLayer) { mapLayer = mapUnboundFeatureLayer; } else { mapLayer = MapLayer(this["mapLayers"][movieClipName(layer.getMapConnector().getID() + layer.getName() + "MapLayer")]); } return mapLayer; } function getMapEditLayer():MapLayer { var editLayer:Layer = ruler.getEditLayer(); return getMapLayer(editLayer); } function getGeometryLayer():GeometryLayer { return geometryLayer; } private function drawAll():Void { drawBackGround(); drawMapLayers(); drawStigma(); drawLandMarks(); if(infoPopUp!=null){ infoPopUp.getPane().getScrollContent().drawInfoFlag(); } geometryLayer = GeometryLayer(attachMovie("GeometryLayer", "geometryLayer_mc", 4, {mapViewer: this})); createEmptyMovieClip("dragBox", 5); drawGPSPosition(); } private function drawGPSPosition():Void { if (this.mapGPSsymbol == null) { this.mapGPSsymbol = new MapGPSSymbol(this); } //GPS symbol is drawn on map through GPS event } // Makes sure that mouse events will always be caught, even if there is no feature at a certain spot. private function drawBackGround():Void { if (this.backGround == null) { this.backGround = createEmptyMovieClip("backGround", 0); } else { this.backGround.clear(); } this.backGround.beginFill(0xFFFFFF, 100); this.backGround.moveTo(0, 0); this.backGround.lineTo(mapWidth, 0); this.backGround.lineTo(mapWidth, mapHeight); this.backGround.lineTo(0, mapHeight); this.backGround.lineTo(0, 0); } private function drawMapLayers():Void { createEmptyMovieClip("mapLayers", 1); var layers:Array = ruler.getGIS().getLayers(); var layer:Layer = null; var layerName:String = ""; for (var i:Number = 0; i < layers.length; i++) { layer = layers[layers.length - 1 - i]; layerName = layer.getName(); var initObject:Object = new Object(); initObject["ruler"] = ruler; initObject["layer"] = layer; initObject["mapViewer"] = this; if(layer.getMapConnector() != null) { this["mapLayers"].attachMovie("MapLayer", movieClipName(layer.getMapConnector().getID() + layerName + "MapLayer"), i , initObject); } } var initObject:Object = new Object(); initObject["ruler"] = ruler; initObject["layer"] = ruler.getGIS().getUnboundFeatureLayer(); initObject["mapViewer"] = this; mapUnboundFeatureLayer = MapUnboundFeatureLayer(this["mapLayers"].attachMovie("MapUnboundFeatureLayer", "mapUnboundFeatureLayer_mc", this["mapLayers"].getNextHighestDepth(), initObject)); } private function drawStigma():Void { var url:String = ruler.getGIS().getActiveMap().getStigmaURL(); if (url != null) { URLTools.loadMovie(this, url, "stigma", 2, null); this["stigma"]._y = mapHeight - 100; // Stigma is always placed at position (0, [stageHeight]). Exact positioning can be done by setting the anchor property of the swf file. this["stigma"]._alpha = 50; // If text is used in stigma, it must be anti-aliased for the alpha to take effect. } } private function drawLandMarks():Void { var landMarks:Array = ruler.getGIS().getLandMarks(); var landMark:Coordinate = null; var centreScale:CentreScale = ruler.getGIS().getCurrentCentreScale(); var x:Number = 0; var y:Number = 0; var depth:Number = 0; if (this["landMarks"] != null) { this["landMarks"].removeMovieClip(); } for (var i:Number = 0; i < landMarks.length; i++) { landMark = landMarks[i]; x = centreScale.getPixX(mapWidth, landMark.getX(), ruler.getGIS().getCoordPixFactor()); y = centreScale.getPixY(mapHeight, landMark.getY(), ruler.getGIS().getCoordPixFactor()); if ((x >= 0) && (x <= mapWidth) && (y >= 0) && (y <= mapHeight)) { if (this["landMarks"] == null) { createEmptyMovieClip("landMarks", 3); } this["landMarks"].attachMovie("LandMark", String(depth), depth); this["landMarks"][String(depth)]._x = x; this["landMarks"][String(depth)]._y = y; depth++; } } } function waitToFinishMapLayerSession(mapLayerSession:MapLayerSession, num:Number):Void { var previousNumBusyMapLayers:Number = numBusyMapLayers; //trace("num = " + num); mapLayerSession.incNumLoadingMapLayers(num); numBusyMapLayers += num; //trace("numBusy: " + numBusyMapLayers); if (numBusyMapLayers == 0) { numBytesLoaded = new Array(); numBytesTotal = new Array(); attachOrUpdateMapTip(); attachOrUpdateMapCustomCursor(); ruler.rulerEventDispatcher.mapViewerReady(this); } else if (previousNumBusyMapLayers == 0) { removeMapTip(); this["customCursor"].hideCustomCursor(); ruler.rulerEventDispatcher.mapViewerBusy(this); } } function setNumBytesLoadedAndTotal(layer:Layer, numBytesLoaded:Number, numBytesTotal:Number):Void { var layerName:String = movieClipName(layer.getMapConnector().getID() + layer.getName()); this.numBytesLoaded[layerName] = numBytesLoaded; this.numBytesTotal[layerName] = numBytesTotal; var numBytesLoadedSum:Number = ArrayTools.getSum(this.numBytesLoaded); var numBytesTotalSum:Number = ArrayTools.getSum(this.numBytesTotal); ruler.rulerEventDispatcher.mapViewerLoad(this, numBytesLoadedSum, numBytesTotalSum); } function onRollOver():Void{ rollingOver = true; this["customCursor"].showCustomCursor(); } function onRollOut():Void{ rollingOver = false; removeMapTip(); this["customCursor"].hideCustomCursor(); } function isRollingOver():Boolean{ return rollingOver; } /** * onSmartPress event handler. A special event is used to overcome the problem of visible non-modal windows that * let the events go through. */ function onSmartPress(Void):Void { var width:Number = this.mapWidth; var height:Number = this.mapHeight; rectX = _xmouse; rectY = _ymouse; ruler.getActiveMode().getAction().performPress(this,_xmouse,_ymouse,null); } /** * onSmartRelease event handler. A special event is used to overcome the problem of visible non-modal windows that * let the events go through. */ function onSmartRelease():Void { // When de mouse "rolls out" while it is dragging, the onRollOut event will not be fired. So in // that case, the property rollingOver can not be set by the onRollOut method. For that reason, the // property rollingOver is set to false in onMouseUp. If the mouse is actually "rolling over" the // onSmartRelease will fire after onMouseUp, and the onSmartRelease method will set the rollingOver // property to true again. rollingOver = true; var width:Number = this.mapWidth; var height:Number = this.mapHeight; ruler.getActiveMode().getAction().performRelease(this); } function setSelection(whichLayer:Number, action: Number):Void { //trace("nl.idgis.giclient.gui.mapviewer.MapViewer.setSelection()"); //do nothing if editing and multiFeatureEdit = false and currentFeature is subselected var editLayer:SelectableLayer = SelectableLayer(ruler.getEditLayer()); if (editLayer != null) { //trace("editLayer.getCurrentFeature().getID() : " + editLayer.getCurrentFeature().getID()); //trace("editLayer.getSubSelectedFeature(editLayer.getCurrentFeature().getID()): " + editLayer.getSubSelectedFeature(editLayer.getCurrentFeature().getID())); if (!ruler.getGIClientConfig().isMultiFeatureEdit() && editLayer.getCurrentFeature() != null && editLayer.getCurrentFeature().getEditingStatus() != Feature.UNCHANGED) { return; } } var mapFeatures:Array = getMapFeaturesUnderMousePointer(whichLayer, false, false); var l:Layer = null; var layer:SelectableLayer = null; if (mapFeatures.length > 0) { var id:String = null; if (typeof(mapFeatures[0]) == "movieclip") { var mapFeature = mapFeatures[0]; //l = ruler.getGIS().getLayer(mapFeature._parent._parent.getLayer().getName()); l = mapFeature._parent._parent.getLayer(); if (!(l instanceof SelectableLayer)) { return; } layer = SelectableLayer(l); id = getFeatureID(mapFeature._name); } else { var mapFeature:MapFeature = mapFeatures[0]; var feature:Feature = mapFeature.getFeature(); layer = SelectableLayer(feature.getLayer()); id = feature.getID(); } if (layer.isSelectable()) { var cumulatively:Boolean = false; if ((Key.isDown(Key.CONTROL)) || (Key.isDown(Key.SHIFT))) { cumulatively = true; } if (action == SelectableLayer.SELECT) { layer.setSelectedFeatures(new Array(id), cumulatively, null); } else if (action == SelectableLayer.CURRENT) { layer.setCurrentFeature(new Array(id), cumulatively); } else if (action == SelectableLayer.SELECT_AND_CURRENT) { layer.setSelectedFeatures(new Array(id), cumulatively, null); layer.setCurrentFeature(new Array(id), false); } } } else if ((whichLayer == ACTIVE_LAYER) || (whichLayer == EDIT_LAYER)) { if (whichLayer == ACTIVE_LAYER) { layer = SelectableLayer(ruler.getGIS().getActiveLayer()); } else { // EDIT_LAYER. layer = SelectableLayer(ruler.getEditLayer()); } if (layer != null) { if (action == SelectableLayer.SELECT) { layer.setSelectedFeatures(new Array(), false, null); } else if (action == SelectableLayer.CURRENT) { layer.setCurrentFeature(new Array(), false); } else if (action == SelectableLayer.SELECT_AND_CURRENT) { layer.setSelectedFeatures(new Array(), false, null); layer.setCurrentFeature(new Array(), false); } } } } function openHyperLink(layer:Layer, featureID:String) { var serverRequest:String = "request=GetFeature&layer=" + layer.getName() + "&id=" + featureID; var xmlResponse:XMLResponse = new XMLResponse(this, serverRequest); //xmlResponse.setRuler(ruler); xmlResponse.setPath(GILayer(layer).getServerURL()); xmlResponse["Layer"] = layer; xmlResponse.load(); } function onLoadXMLResponse(xmlResponse:XMLResponse):Void { //trace(xmlResponse); var hyperlinkColumnPath:String = xmlResponse["Layer"].getHyperlinkColumn().getPath(); var hyperlinkColumnURLPrefix:String = xmlResponse["Layer"].getHyperlinkColumn().getURLPrefix(); if(hyperlinkColumnURLPrefix == null) { hyperlinkColumnURLPrefix = ""; } var rootNode:XMLNode = XMLTools.getChild(xmlResponse["Layer"].getName(), xmlResponse.firstChild); var hyperLink:String = XMLTools.getStringValue(hyperlinkColumnPath, rootNode); var url:String = hyperlinkColumnURLPrefix + hyperLink;; if (url.indexOf(":") == -1) { // Assumes that an occurence of ":" means an absolute URL. var serverUrl:String = GILayer(xmlResponse["Layer"]).getServerURL(); serverUrl = serverUrl.substring(0, serverUrl.lastIndexOf("/") + 1); url = serverUrl + url; } _root.getURL(url, "_blank"); } private function delayedMouseMove() { initInfoPopUp(); attachOrUpdateMapTip(); } function onMouseMove():Void { _global["clearTimeout"](mouseMoveTimeoutId); removeMapTip(); if (rollingOver) { if ((!selectDragging) && (!zoomDragging) && (!panDragging)) { _global["clearTimeout"](mouseMoveTimeoutId); mouseMoveTimeoutId = _global["setTimeout"](this, "delayedMouseMove", 200); } // Dispatches event for statusbar. var envelope:Envelope = ruler.getGIS().getCurrentCentreScale().toEnvelope(mapWidth, mapHeight, ruler.getGIS().getCoordPixFactor()); ruler.getGIS().gisEventDispatcher.mapMouseMove( ((envelope.getMaxX() - envelope.getMinX()) / mapWidth) * _xmouse + envelope.getMinX(), ((envelope.getMaxY() - envelope.getMinY()) / mapHeight) * (mapHeight - _ymouse) + envelope.getMinY()); } ruler.getActiveMode().getAction().performMouseMove(this); if ((zoomDragging) || (panDragging)) { ruler.getActiveMode().getAction().performDrag(this); } } function onMouseUp():Void { if ((selectDragging) || (zoomDragging)) { this["dragBox"].clear(); } if ((selectDragging) || (zoomDragging) || (panDragging)) { this["customCursor"].setDragging(false); } ruler.getActiveMode().getAction().performMouseUp(this,_xmouse,_ymouse); /*if (selectDragging) { var centreScale:CentreScale = ruler.getGIS().getCurrentCentreScale(); var scale:Number = centreScale.getScale(); var envelope:Envelope = centreScale.toEnvelope(width, height, ruler.getGIS().getCoordPixFactor()); var minX; var minY; var maxX; var maxY; if((rectX == rectX2) && (rectY == rectY2)) { } else if (rectX < rectX2) { minX = rectX * ruler.getGIS().getCoordPixFactor() * scale + envelope.getMinX(); minY = (height - rectY2) * ruler.getGIS().getCoordPixFactor() * scale + envelope.getMinY(); maxX = rectX2 * ruler.getGIS().getCoordPixFactor() * scale + envelope.getMinX(); maxY = (height - rectY) * ruler.getGIS().getCoordPixFactor() * scale + envelope.getMinY(); } else { minX = rectX2 * ruler.getGIS().getCoordPixFactor() * scale + envelope.getMinX(); minY = (height - rectY) * ruler.getGIS().getCoordPixFactor() * scale + envelope.getMinY(); maxX = rectX * ruler.getGIS().getCoordPixFactor() * scale + envelope.getMinX(); maxY = (height - rectY2) * ruler.getGIS().getCoordPixFactor() * scale + envelope.getMinY(); } var url:String = ruler.getGIClientConfig().getServerURLPrefix() + "request=GetFeature&layer=" + ruler.getGIS().getActiveLayer().getName() + "&envelope=" + minX + "," + minY + "," + maxX + "," + maxY; var newXML = new XML(); newXML.load(url); newXML.onLoad = function(success) { } }*/ // When de mouse "rolls out" while it is dragging, the onRollOut event will not be fired. So in // that case, the property rollingOver can not be set by the onRollOut method. For that reason, the // property rollingOver is set to false in onMouseUp. If the mouse is actually "rolling over" the // onSmartRelease will fire after onMouseUp, and the onSmartRelease method will set the rollingOver // property to true again. rollingOver = false; } private function attachOrUpdateMapTip():Void { var mapFeaturesUnderMousePointer:Array = getMapFeaturesUnderMousePointer(FRONTMOST_LAYER, true, true); if (mapFeaturesUnderMousePointer.length > 0) { var mapTipText:String = mapFeaturesUnderMousePointer[0]; if(mapTipText != "") { this.mapTipText = mapTipText; if (this["mapTip"] == null) { attachMovie("GeoideTip", "mapTip", 6, {displayShadow: true, faceColor: "0xffdaae", borderColor: "0x000000", useFade: true}); } this["mapTip"].displayText = mapTipText; this["mapTip"].displayToolTip(); } else { if(this["mapTip"] != null) { this["mapTip"].removeToolTip(); } } } else { removeMapTip(); } featureInfoMapTip.addMaptip(_xmouse, _ymouse); } private function initInfoPopUp():Void { var mapFeaturesUnderMousePointer:Array = getMapFeaturesUnderMousePointer(POPUP_LAYERS, false, false); if (mapFeaturesUnderMousePointer.length > 0) { var layer:Layer = mapFeaturesUnderMousePointer[0]._parent._parent.getLayer(); var featureID:String = getFeatureID(mapFeaturesUnderMousePointer[0]._name); if(GILayer(layer).getPopUpInfoUrl()!=null && GILayer(layer).getPopUpInfoTrigger()=="MouseHoover"){ if (popupDelayIntervalID != 0) { clearInterval(popupDelayIntervalID); } popupDelayIntervalID = setInterval(this, "attachOrUpdateInfoPopUp", 500, layer,featureID); } } } public function attachOrUpdateInfoPopUp(layer:Layer,featureID:String):Void { if (popupDelayIntervalID != 0) { clearInterval(popupDelayIntervalID); popupDelayIntervalID = 0; } infoPopUp = SinglePaneComponent(ruler.getGIClientConfig().getGIComponent("InfoPopUp")); var pane:Frame = infoPopUp.getPane(); var dateTime:Date = null; if (layer instanceof AnimationLayer) { dateTime = ruler.getGIS().getCurrentTimeStamp(); } if (pane == null){ var url:String = GILayer(layer).getPopUpInfoUrl() + featureID; var contentProperties:Object = new Object(); contentProperties["mapViewer"] = this; contentProperties["layer"] = layer; contentProperties["featureID"] = featureID; contentProperties["dateTime"] = dateTime; infoPopUp.showPane(contentProperties); } ruler.getGIS().setPopUpInfoFeature(layer,featureID, dateTime); } private function removeMapTip():Void { if (this["mapTip"] != null) { this["mapTip"].removeToolTip(); this["mapTip"].removeMovieClip(); mapTipText = null; } featureInfoMapTip.cancelMaptip(); } private function attachOrUpdateMapCustomCursor():Void { if (this["customCursor"] == null){ attachMovie("CustomCursor","customCursor", 7, {intervaltime:100}); } var url:String = ruler.getActiveMode().getCustomCursorURL(); var hideMouse:Boolean = false; var xOffset:Number = 15; var yOffset:Number = 5; var visible:Boolean = rollingOver; this["customCursor"].updateCustomCursor(url, hideMouse, xOffset, yOffset, visible); } function getMapFeaturesUnderMousePointer(whichLayers:Number, mapTippedLayers:Boolean, idsOnly:Boolean):Array { var layers:Array = new Array(); if (whichLayers == FRONTMOST_LAYER) { if (ruler.getGIS().getActiveMap().getUnboundFeatureLayer()) { layers.push(ruler.getGIS().getUnboundFeatureLayer()); } layers = layers.concat(ruler.getGIS().getVisibleLayers()); } else if (whichLayers == ACTIVE_LAYER) { var activeLayer:Layer = ruler.getGIS().getActiveLayer(); layers.push(activeLayer); } else if (whichLayers == EDIT_LAYER) { var editLayer:Layer = ruler.getEditLayer(); layers.push(editLayer); } else if (whichLayers == POPUP_LAYERS) { var allLayers:Array = ruler.getGIS().getVisibleLayers(); for (var i:Number = 0; i < allLayers.length; i++) { if(allLayers[i].getPopUpInfoUrl() != null){ layers.push(allLayers[i]); } } } var mapLayer:MapLayer = null; var mapFeaturesUnderMousePointer:Array = new Array(); for (var i:Number = 0; i < layers.length; i++) { if(layers[i] instanceof GILayer) { mapLayer = getMapLayer(Layer(layers[i])); mapFeaturesUnderMousePointer = mapFeaturesUnderMousePointer.concat( mapLayer.getMapFeatures(_xmouse, _ymouse, false, mapTippedLayers, idsOnly, true)); if ((whichLayers == FRONTMOST_LAYER) && (mapFeaturesUnderMousePointer.length > 0)) { break; } } } return mapFeaturesUnderMousePointer; } function pixel2Point(pixX:Number, pixY:Number):Point { var pointX:Number = ruler.getGIS().getCurrentCentreScale().getCoordX(mapWidth, pixX, ruler.getGIS().getCoordPixFactor()); var pointY:Number = ruler.getGIS().getCurrentCentreScale().getCoordY(mapHeight, pixY, ruler.getGIS().getCoordPixFactor()); return new Point(ruler.getGIS().getActiveMap().getSRS(), pointX, pointY); } function point2Pixel(pointX:Number, pointY:Number):Pixel { var pixX:Number = ruler.getGIS().getCurrentCentreScale().getPixX(mapWidth, pointX, ruler.getGIS().getCoordPixFactor()); var pixY:Number = ruler.getGIS().getCurrentCentreScale().getPixY(mapHeight, pointY, ruler.getGIS().getCoordPixFactor()); return new Pixel(pixX, pixY); } function stopAnimation() { var mapLayers:Array = getMapLayers(); for (var i:Number = 0; i < mapLayers.length; i++) { var mapLayer:MapLayer = MapLayer(mapLayers[i]); if (mapLayer.getLayer() instanceof AnimationLayer) { //mapLayer.stopTimeline(); } } } function onSRSChange():Void { var action:Object = ruler.getActiveMode().getAction(); if(action instanceof MapViewerSelectByGeometry) { var select:MapViewerSelectByGeometry = MapViewerSelectByGeometry(action); select.exit(this); } onZoom(); } function onStateEvent(stateEvent:StateEvent):Void { onLoad(); } function drawCrossHair():Void{ if(this["crossHair"]!=null){ this["crossHair"].removeMovieClip(); } crossHair_mc= this.createEmptyMovieClip("crossHair", this.getNextHighestDepth()); crossHair_mc.lineStyle(3, 0xFFFFFF); crossHair_mc.moveTo(-10,0); crossHair_mc.lineTo(10,0); crossHair_mc.moveTo(0,-10); crossHair_mc.lineTo(0,10); crossHair_mc.lineStyle(1, 0x000000); crossHair_mc.moveTo(-10,0); crossHair_mc.lineTo(10,0); crossHair_mc.moveTo(0,-10); crossHair_mc.lineTo(0,10); crossHair_mc._x= this._xmouse; crossHair_mc._y =this._ymouse; var point:Point = this.pixel2Point(this._xmouse, this._ymouse); crossHair_mc["point"] = point; } }