/*---------------- 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 mx.controls.Button; import mx.utils.Delegate; import nl.idgis.giclient.gui.ContainerContent; import nl.idgis.giclient.geoma.Geometry; import nl.idgis.giclient.geoma.NullGeometry; import nl.idgis.giclient.gis.Feature; import nl.idgis.giclient.gis.Layer; import nl.idgis.giclient.framework.IDComboBox; import nl.idgis.giclient.gis.SelectableLayer; import nl.idgis.giclient.gis.FeatureGeometryListener; import nl.idgis.giclient.util.Strings; class nl.idgis.giclient.gui.mapviewer.SelectBySelection extends ContainerContent implements FeatureGeometryListener { private var contentWidth:Number = -1; private var horiMargin:Number = 8; private var checkBoxSize:Number = 10; private var textFieldHeight:Number = 20; private var targetLayersPanelHeight:Number = -1; private var textFormat:TextFormat = null; private var sourceLayerPicker:IDComboBox = null; private var statusTextField:TextField = null; private var selectedTargetLayers:Array = null; function onLoad():Void { contentWidth = _parent._width; textFormat = new TextFormat(); textFormat.font = "_sans"; textFormat.size = 11; selectedTargetLayers = new Array(); drawSourceLayerPanel(); } function onChangeFeatureGeometry(feature:Feature):Void { feature.featureEventDispatcher.removeFeatureGeometryListener(this); setSelection(); } private function drawSourceLayerPanel():Void { var sourceLayerPanel:MovieClip = createEmptyMovieClip("sourceLayerPanel_mc", 0); sourceLayerPanel.createTextField("headerTextField_mc", 0, 0, 0, contentWidth, 20); var headerTextField:TextField = sourceLayerPanel.headerTextField_mc; headerTextField.setNewTextFormat(textFormat); headerTextField.text = // "Selecteer kaartlaag waarmee geselecteerd wordt:"; (Strings.getFile("Geoide").getString("SelectLayerForSelection")) ; sourceLayerPicker = IDComboBox(this["sourceLayerPanel_mc"].attachMovie("IDComboBox", "entryComboBox", 1, {_x: horiMargin, _y: 20, _width:200})); sourceLayerPicker.textField.setNewTextFormat(textFormat); sourceLayerPicker.addEventListener("select", Delegate.create(this, onSelectSourceLayer)); setSourceLayerPicker(); _parent.refreshPane(); } private function onSelectSourceLayer():Void{ selectedTargetLayers = new Array(); drawTargetLayersPanel(); drawSelectButton(); drawStatusBar(); _parent.refreshPane(); } private function setSourceLayerPicker():Void{ var layers:Array = ruler.getGIS().getSelectableLayers(); var layerProvider = new Array(); layerProvider.push({label:// "--Selecteer een kaartlaag --", (Strings.getFile("Geoide").getString("SelectLayer")), data:null}); for (var i:Number = 0; i < layers.length; i++) { layerProvider.push ({label:layers[i].getTitle(), data:layers[i]}); } layerProvider.sortOn("label", Array.CASEINSENSITIVE); sourceLayerPicker.dataProvider = layerProvider; } private function drawTargetLayersPanel():Void { if(this["targetLayersPanel_mc"] != null){ this["targetLayersPanel_mc"].removeMovieClip(); } var targetLayersPanel:MovieClip = createEmptyMovieClip("targetLayersPanel_mc", 1); targetLayersPanel._y = 50; targetLayersPanel.createTextField("headerTextField_mc", 0, 0, 0, contentWidth, 20); var headerTextField:TextField = targetLayersPanel.headerTextField_mc; headerTextField.setNewTextFormat(textFormat); headerTextField.text = // "Vink kaartlagen aan waaruit geselecteerd wordt:"; (Strings.getFile("Geoide").getString("CheckLayersForSelection")); var layers:Array = ruler.getGIS().getSelectableLayers(); var layer:Layer = null; var layerName:String = null; var initObject:Object = null; targetLayersPanelHeight = 20 + ((layers.length - 1) * textFieldHeight); var targetLayers:Array = new Array(); for (var i:Number = 0; i < layers.length; i++) { layer = Layer(layers[i]); if (Layer(sourceLayerPicker.selectedItem.data) == layer) { //overslaan } else { targetLayers.push({label:layer.getTitle(), data:layer}); } } targetLayers.sortOn("label", Array.CASEINSENSITIVE); for (var i:Number = 0; i < targetLayers.length; i++) { layerName = Layer(targetLayers[i].data).getName(); layer = Layer(targetLayers[i].data); initObject = new Object(); initObject["_x"] = horiMargin; initObject["_y"] = (i + 1) * textFieldHeight + 5; initObject["_width"] = checkBoxSize; initObject["_height"] = checkBoxSize; targetLayersPanel.attachMovie("CheckBox", layerName + "CheckBox", i * 2 + 1, initObject); targetLayersPanel[layerName + "CheckBox"]["layer"] = layer; targetLayersPanel[layerName + "CheckBox"].addEventListener("click", Delegate.create(this, onClickCheckBox)); targetLayersPanel.createTextField(layerName + "TextField", i * 2 + 2, checkBoxSize + (2 * horiMargin), (i + 1) * textFieldHeight, contentWidth - checkBoxSize - (3 * horiMargin), textFieldHeight); targetLayersPanel[layerName + "TextField"].setNewTextFormat(textFormat); targetLayersPanel[layerName + "TextField"].text = targetLayers[i].label; } } function onClickCheckBox(eventObject:Object):Void { if (eventObject.target.selected) { addSelectedTargetLayer(eventObject.target["layer"]); } else { removeSelectedTargetLayer(eventObject.target["layer"]); } } private function addSelectedTargetLayer(layer):Void { for (var i:String in selectedTargetLayers) { if (selectedTargetLayers[i] == layer) { return; // Already present. } } selectedTargetLayers.push(layer); } private function removeSelectedTargetLayer(layer):Void { for (var i:Number = 0; i < selectedTargetLayers.length; i++) { if (selectedTargetLayers[i] == layer) { selectedTargetLayers.splice(i, 1); return; } } } private function drawSelectButton():Void { if(this["selectButton_mc"] == null){ var initObject:Object = new Object(); initObject["_x"] = horiMargin; initObject["_y"] = 55 + targetLayersPanelHeight; initObject["label"] = //"Selecteer"; (Strings.getFile("Geoide").getString("Select")); var selectButton:Button = Button(attachMovie("Button", "selectButton_mc", 2, initObject)); selectButton.addEventListener("click", Delegate.create(this, onClickSelectButton)); } } function onClickSelectButton(eventObject:Object):Void { setSelection(); } private function setSelection():Void { var layer:SelectableLayer = SelectableLayer(sourceLayerPicker.selectedItem.data); if (layer == null) { state//("Geen kaartlaag geselecteerd."); (Strings.getFile("Geoide").getString("NoLayerSelected")); } else { var selectedFeatures:Array = layer.getSelectedFeatures(); if (selectedFeatures.length == 0) { state//("Kaartlaag heeft geen selectie."); (Strings.getFile("Geoide").getString("LayerHasNoSelection")); } else { var feature:Feature = selectedFeatures[0]; var geometry:Geometry = feature.getGeometry(); if (geometry == null) { state//("Geometrie aan het laden..."); (Strings.getFile("Geoide").getString("LoadingGeometry")); feature.featureEventDispatcher.addFeatureGeometryListener(this); feature.requestProperties(); // To onChangeFeatureGeometry. } else if (geometry instanceof NullGeometry) { state//("Selectie heeft geen geometrie."); (Strings.getFile("Geoide").getString("SelectionHasNoGeometry")); } else { state(""); for (var i:String in selectedTargetLayers) { SelectableLayer(selectedTargetLayers[i]).setSelectedFeaturesByGeometry(geometry); SelectableLayer(selectedTargetLayers[i]).setVisible(true); } } } } } private function drawStatusBar():Void { if(this["statusTextField"] == null){ createTextField("statusTextField", 3, horiMargin,targetLayersPanelHeight + 80, contentWidth - horiMargin, 20); statusTextField.setNewTextFormat(textFormat); } } private function state(statement:String):Void { statusTextField.text = statement; } }