/*---------------- 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.gis.AttrInfoListener; import nl.idgis.giclient.gis.Layer; import nl.idgis.giclient.gis.LayerExpandedListener; import nl.idgis.giclient.gis.LayerFilteredFeaturesListener; import nl.idgis.giclient.gis.LayerLoadedFeaturesListener; import nl.idgis.giclient.gis.LayerRefreshListener; import nl.idgis.giclient.gis.LayerVisibleListener; import nl.idgis.giclient.gis.SelectionListener; import nl.idgis.giclient.gui.mapviewer.MapLayerLoadListener; class nl.idgis.giclient.gis.LayerEventDispatcher { private var layerVisibleListeners:Array = null; private var layerExpandedListeners:Array = null; private var layerRefreshListeners:Array = null; private var layerFilteredFeaturesListeners:Array = null; private var layerLoadedFeaturesListeners:Array = null; private var selectionListeners:Array = null; private var mapLayerLoadListeners:Array = null; private var attrInfoListeners:Array = null; private var loadingSubLayers:Object; function LayerEventDispatcher() { layerVisibleListeners = new Array(); layerExpandedListeners = new Array(); layerRefreshListeners = new Array(); layerFilteredFeaturesListeners = new Array(); layerLoadedFeaturesListeners = new Array(); selectionListeners = new Array(); mapLayerLoadListeners = new Array(); attrInfoListeners = new Array(); loadingSubLayers = new Object(); } function addLayerVisibleListener(layerVisibleListener:LayerVisibleListener):Void { layerVisibleListeners.push(layerVisibleListener); } function removeLayerVisibleListener(layerVisibleListener:LayerVisibleListener):Void { for (var i:Number = 0; i < layerVisibleListeners.length; i++) { if (layerVisibleListener == layerVisibleListeners[i]){ layerVisibleListeners.splice(i, 1); } } } function addLayerExpandedListener(layerExpandedListener:LayerExpandedListener):Void { layerExpandedListeners.push(layerExpandedListener); } function removeLayerExpandedListener(layerExpandedListener:LayerExpandedListener):Void { for (var i:Number = 0; i < layerExpandedListeners.length; i++) { if (layerExpandedListener == layerExpandedListeners[i]){ layerExpandedListeners.splice(i, 1); } } } function addLayerRefreshListener(layerRefreshListener:LayerRefreshListener):Void { layerRefreshListeners.push(layerRefreshListener); } function removeLayerRefreshListener(layerRefreshListener:LayerRefreshListener):Void { for (var i:Number = 0; i < layerRefreshListeners.length; i++) { if (layerRefreshListener == layerRefreshListeners[i]){ layerRefreshListeners.splice(i, 1); } } } function addLayerFilteredFeaturesListener(layerFilteredFeaturesListener:LayerFilteredFeaturesListener):Void { layerFilteredFeaturesListeners.push(layerFilteredFeaturesListener); } function removeLayerFilteredFeaturesListener(layerFilteredFeaturesListener:LayerFilteredFeaturesListener):Void { for (var i:Number = 0; i < layerFilteredFeaturesListeners.length; i++) { if (layerFilteredFeaturesListener == layerFilteredFeaturesListeners[i]){ layerFilteredFeaturesListeners.splice(i, 1); } } } function addLayerLoadedFeaturesListener(layerLoadedFeaturesListener:LayerLoadedFeaturesListener):Void { layerLoadedFeaturesListeners.push(layerLoadedFeaturesListener); } function removeLayerLoadedFeaturesListener(layerLoadedFeaturesListener:LayerLoadedFeaturesListener):Void { for (var i:Number = 0; i < layerLoadedFeaturesListeners.length; i++) { if (layerLoadedFeaturesListener == layerLoadedFeaturesListeners[i]){ layerLoadedFeaturesListeners.splice(i, 1); } } } function addSelectionListener(selectionListener:SelectionListener):Void { selectionListeners.push(selectionListener); } function removeSelectionListener(selectionListener:SelectionListener):Void { for (var i:Number = 0; i < selectionListeners.length; i++) { if (selectionListener == selectionListeners[i]){ selectionListeners.splice(i, 1); } } } function addAttrInfoListener(attrInfoListener:AttrInfoListener):Void { attrInfoListeners.push(attrInfoListener); } function removeAttrInfoListener(attrInfoListener:AttrInfoListener):Void { for (var i:Number = 0; i < attrInfoListeners.length; i++) { if (attrInfoListener == attrInfoListeners[i]){ attrInfoListeners.splice(i, 1); } } } function addMapLayerLoadListener(mapLayerLoadListener:MapLayerLoadListener):Void { mapLayerLoadListeners.push(mapLayerLoadListener); } function removeMapLayerLoadListener(mapLayerLoadListener:MapLayerLoadListener):Void { for (var i:Number = 0; i < mapLayerLoadListeners.length; i++) { if (mapLayerLoadListener == mapLayerLoadListeners[i]){ mapLayerLoadListeners.splice(i, 1); } } } function changeLayerVisible(layer:Layer):Void { updateListeners(layerVisibleListeners); for (var i:Number = 0; i < layerVisibleListeners.length; i++) { layerVisibleListeners[i].onChangeLayerVisible(layer); } } function changeLayerExpanded():Void { updateListeners(layerExpandedListeners); for (var i:Number = 0; i < layerExpandedListeners.length; i++) { layerExpandedListeners[i].onChangeLayerExpanded(); } } function refresh(layer:Layer):Void { updateListeners(layerRefreshListeners); for (var i:Number = 0; i < layerRefreshListeners.length; i++) { layerRefreshListeners[i].onLayerRefresh(layer); } } function changeFilteredFeatures(layer:Layer):Void { updateListeners(layerFilteredFeaturesListeners); for (var i:Number = 0; i < layerFilteredFeaturesListeners.length; i++) { layerFilteredFeaturesListeners[i].onChangeLayerFilteredFeatures(layer); } } function changeLoadedFeatures(layer:Layer):Void { updateListeners(layerLoadedFeaturesListeners); for (var i:Number = 0; i < layerLoadedFeaturesListeners.length; i++) { layerLoadedFeaturesListeners[i].onChangeLayerLoadedFeatures(layer); } } function changeSelectedFeatures(layer:Layer, selected:Boolean, subSelected:Boolean, current:Boolean):Void { updateListeners(selectionListeners); for (var i:Number = 0; i < selectionListeners.length; i++) { selectionListeners[i].onChangeLayerSelectedFeatures(layer, selected, subSelected, current); } } function selectAttrInfoFeatures(layer:Layer):Void { updateListeners(attrInfoListeners); for (var i:Number = 0; i < attrInfoListeners.length; i++) { attrInfoListeners[i].onChangeLayerAttrInfoFeatures(layer); } } function subMapLayerLoadProgress(layer:Layer, percentage:Number):Void { var id:String = layer.getMapConnector().getID() + layer.getName(); if(percentage != 0) { loadingSubLayers[id] = percentage; } else { loadingSubLayers[id] = null; } var totalPercentage:Number = 0; var count:Number = 0; for(var i:String in loadingSubLayers) { totalPercentage += loadingSubLayers[i]; count++; } var resultPercentage = totalPercentage / count; if(resultPercentage == 100) { loadingSubLayers = new Object(); } mapLayerLoadProgress(layer.getSuperLayer(), resultPercentage); } function mapLayerLoadProgress(layer:Layer, percentage:Number):Void { var superLayer:Layer = layer.getSuperLayer(); if(superLayer != null) { superLayer.layerEventDispatcher.subMapLayerLoadProgress(layer, percentage); } updateListeners(mapLayerLoadListeners); for (var i:Number = 0; i < mapLayerLoadListeners.length; i++) { mapLayerLoadListeners[i].onMapLayerLoadProgress(layer, percentage); } } private function updateListeners(listeners:Array):Void { for (var i:Number = 0; i < listeners.length; i++) { if (listeners[i].toString() == null) { // toString() is necessary as movieclips will never become null. listeners.splice(i--, 1); // i-- because the array that is being looped is also being spliced. } else { for (var j:Number = 0; j < listeners.length; j++) { if ((listeners[i] == listeners[j]) && (i != j)) { listeners.splice(j--, 1); // j-- because the array that is being looped is also being spliced. i is not affected because j is always greater than i here. } } } } } }