/*---------------- 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.geoma.Envelope; import nl.idgis.giclient.gis.CentreScale; import nl.idgis.giclient.gis.Coordinate; import nl.idgis.giclient.gis.Feature; import nl.idgis.giclient.gis.Layer; import nl.idgis.giclient.gis.PopUpInfoFeatureListener; import nl.idgis.giclient.gui.htmlviewer.HtmlViewer; import nl.idgis.giclient.gui.mapviewer.MapViewer; import nl.idgis.giclient.util.SynchListener; import nl.idgis.giclient.util.URLTools; import nl.idgis.giclient.StringTools; import nl.idgis.giclient.gis.Map; import nl.idgis.giclient.gis.SelectableLayer; import nl.idgis.giclient.util.Strings; import nl.idgis.giclient.event.StateEventListener; import nl.idgis.giclient.event.StateEvent; import nl.idgis.giclient.framework.SinglePaneComponent; class nl.idgis.giclient.gui.popupviewer.InfoPopUpViewer extends HtmlViewer implements PopUpInfoFeatureListener,SynchListener,StateEventListener { private var mapViewer:MapViewer;//set by initObject private var infoFlag:MovieClip = null; private var flagDepth:Number; private var waving:Boolean = true; private var movieClipLoader:MovieClipLoader = null; private var infoFeature:Feature; private var infoFlagLocation:Coordinate= null; function onLoad():Void { super.onLoad(); ruler.getGIS().gisEventDispatcher.addPopUpInfoFeatureListener(this); movieClipLoader = new MovieClipLoader(); movieClipLoader.addListener(this); //setPopUpInfoFeature in the onLoad because of asynchrone loading of scrollcontent mapViewer = frame.contentProperties.mapViewer; flagDepth = mapViewer.getNextHighestDepth(); var layer:Layer = frame.contentProperties.layer; var featureID:String = frame.contentProperties.featureID; var dateTime:Date = frame.contentProperties.dateTime; ruler.getGIS().setPopUpInfoFeature(layer,featureID, dateTime); //frame.setSize(((Stage.width/2) - 40),((Stage.height/2) - 70)); if (mapViewer._xmouse <= Stage.width/2){ frame._x = (Stage.width/2) + 20; } else { frame._x = 20; } if (mapViewer._ymouse <= Stage.height/2){ frame._y = (Stage.height/2) + 35; } else { frame._y = 35; } var popUpViewer:SinglePaneComponent = SinglePaneComponent(ruler.getGIClientConfig().getGIComponent("InfoPopUp")); popUpViewer.addEventListener(this, StateEvent.CHANGE, "visible"); } function onStateEvent(stateEvent : StateEvent) : Void { if(stateEvent.getActionType() == StateEvent.CHANGE && stateEvent.getPropertyName() == "visible" && stateEvent.getSourceClassName() == "SinglePaneComponent") { if(mapViewer["crossHair"]!=null){ mapViewer["crossHair"].removeMovieClip(); } if(mapViewer["infoFlag"]!=null){ mapViewer["infoFlag"].removeMovieClip(); mapViewer["flagMask"].removeMovieClip(); } ruler.getGIS().setPopUpInfoFeature(null,null); clearHtml(); } } function onChangePopUpInfoFeature(feature:Feature, dateTime:Date):Void { if(feature!=null){ this.infoFeature = feature; infoFeature.loadEnvelope(this);//to onSynch var url:String = feature.getLayer().getPopUpInfoUrl(); if(url=="default"){ this.infoFeature.requestProperties(this); } else { if (url.indexOf(":") == -1) { // Assumes that an occurence of ":" means an absolute URL. var serverUrl:String = feature.getLayer().getServerURL(); url = serverUrl.substr(0, serverUrl.lastIndexOf("/") + 1) + url; } // TODO relative paths if (dateTime == null) { url = url + feature.getID(); } else { var parts:Array = url.split("{0}"); var parts1:Array = url.split("{0}"); var timepar:String = String(parts[1]).substring(0,String(parts[1]).indexOf("{1}")); var dateTimeStr = StringTools.dateTimeToString(dateTime); url = parts[0] + feature.getID() + "&" + timepar + dateTimeStr; } showHtml(url); } } } private function buildDefaultHtml():Void{ var layer:SelectableLayer = SelectableLayer(this.infoFeature.getLayer()); var columns:Array = layer.getContextColumns(); var deepestLevel:Number = layer.getLevel(); var size:Number = 14 + (2*deepestLevel); if(deepestLevel==0){ deepestLevel=1; } var level:Number = deepestLevel; var layerTitles:Array = new Array(); var htmlString:String = ""; var lyr:Layer = layer; while (level!=0) { level = lyr.getLevel(); if(lyr.getMetaUrl()!=null){ layerTitles[level] = "" + lyr.getTitle() + ""; } else { layerTitles[level] = lyr.getTitle(); } lyr = lyr.getSuperLayer(); } var tabStop:Number = 0; for(var i:Number=0;i\t" + layerTitles[i] + "

"; size = size - 2; } var value:String; var tabStop2:Number = tabStop + 100; htmlString += ""; for(var c:Number=0;c" + Strings.getFile("Print").getString("UrlLabel") + "

"; } else { htmlString+="

\t" + title + "\t"; if (value.length < 50){ htmlString+= value + "

"; } else { var index1:Number = 0; var indexspace:Number = 0; var temp:String = ''; while(index1 < value.length){ temp = value.substr(index1, 50); if(temp.length == 50) { indexspace = temp.lastIndexOf(' '); htmlString+= "

\t\t" + value.substr(index1,indexspace) + "

"; } else { indexspace = 50; htmlString+= "

\t\t" + temp + "

"; } index1 += indexspace + 1; } htmlString += "

"; } } } htmlString += "
"; //redraw all, work around flash bug in html rendering drawAll(); textField.htmlText = htmlString; } private function drawInfoFlag(){ var flagurl:String = URLTools.getGIClientPath(); flagurl += "/infoFlag.jpg"; infoFlag = mapViewer.createEmptyMovieClip("infoFlag", flagDepth); movieClipLoader.loadClip(flagurl, infoFlag); } function onLoadProgress(target:MovieClip, numBytesLoaded:Number, numBytesTotal:Number) { } function onLoadError(target:MovieClip, errorCode:Number) { } function onLoadInit(target:MovieClip):Void { target._width = 24; target._height = 18; positionFlag(); if(waving){ startWavingFlag(); } } private function startWavingFlag():Void{ // Waving Flag - Jim Bumgardner (www.jbum.com) // var kNbrStrips = 12; var flagMask:MovieClip = mapViewer.createEmptyMovieClip("flagMask", flagDepth + 1); var kMaskWidth = Math.ceil(mapViewer["infoFlag"]._width/kNbrStrips); flagMask.beginFill(0, 0); flagMask.moveTo(0,-4); flagMask.lineTo(kMaskWidth + 22 ,-4); flagMask.lineTo(kMaskWidth + 22, mapViewer["infoFlag"]._height + 8); flagMask.lineTo(0, mapViewer["infoFlag"]._height + 8); flagMask.lineTo(0,-4); flagMask.endFill(); flagMask._x = mapViewer["infoFlag"]._x; flagMask._y = mapViewer["infoFlag"]._y; mapViewer["infoFlag"].setMask(flagMask); var flags = new Array(); flags[0] = mapViewer["infoFlag"]; var kLayerStart = flagDepth + 1; for (var i:Number=1; i0; --i) { flags[i]._rotation = flags[i-1]._rotation; } var t = getTimer(); this._rotation = Math.sin(t*.001+Math.cos(t*.0005)*Math.PI*2)*4; }; } private function positionFlag():Void{ var x:Number = 0; var y:Number = 0; var centreScale:CentreScale = ruler.getGIS().getCurrentCentreScale(); x = centreScale.getPixX(Stage.width, infoFlagLocation.getX(), ruler.getGIS().getCoordPixFactor()); y = centreScale.getPixY(Stage.height, infoFlagLocation.getY(), ruler.getGIS().getCoordPixFactor()); mapViewer["infoFlag"]._x = Math.round(x); mapViewer["infoFlag"]._y = Math.round(y) - mapViewer["infoFlag"]._height; mapViewer["flagMask"]._x = mapViewer["infoFlag"]._x; mapViewer["flagMask"]._y = mapViewer["infoFlag"]._y; } function onSynch(target:Object, action:String):Void { if (action == "ENVELOPE"){ var envelope:Envelope = infoFeature.getEnvelope(); var centre:CentreScale = envelope.toCentreScale(); infoFlagLocation = new Coordinate(centre.getCentreX(), centre.getCentreY()); if(mapViewer["infoFlag"]==null){ drawInfoFlag(); } else { positionFlag(); } } if (action == "PROPERTIES"){ buildDefaultHtml(); } } }