using System; using System.Collections.Generic; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Xml; using ESRI.ArcGIS.Client.Toolkit.DataSources; using OpenEarth.DataViewer.Helpers; namespace OpenEarth.DataViewer.Windows { /// /// Interaction logic for LayerListBox.xaml /// public partial class KmlLayerListBox : UserControl { private readonly List mapLayers; public KmlLayerListBox() { InitializeComponent(); mapLayers = new List(); if (CreateDataSet()) { LinkDataSet(); } } public static DependencyProperty MessageProperty = DependencyProperty.Register("ItemsSource", typeof(Array), typeof(KmlLayerListBox)); private bool CreateDataSet() { var doc = new XmlDocument(); try { doc.Load("KMLLayers.xml"); var elements = doc.SelectNodes("//layers/layer"); if (elements != null) { foreach (XmlElement element in elements) { var mapLayer = new LayerWrapper { Layer = new KmlLayer { Opacity = 0.5, Visible = true } }; foreach (XmlNode child in element.ChildNodes) { if (child.Name.ToLower() == "name") { mapLayer.Name = child.ChildNodes[0].Value; } if (child.Name.ToLower() == "id") { mapLayer.Layer.ID = child.ChildNodes[0].Value; } if (child.Name.ToLower() == "url") { ((KmlLayer)mapLayer.Layer).Url = new Uri(child.ChildNodes[0].Value); } if (child.Name.ToLower() == "source") { mapLayer.Source = child.ChildNodes[0].Value; } if (child.Name.ToLower() == "var") { mapLayer.Variable = child.ChildNodes[0].Value; } } mapLayers.Add(mapLayer); } } return true; } catch (Exception ex) { textBoxError.Visibility = Visibility.Visible; textBoxError.Text = ex.Message; return false; } } private void LinkDataSet() { SetValue(MessageProperty, mapLayers.Select(layer => layer.Name).ToList().ToArray()); } private void ListBoxSelectionChanged(object sender, SelectionChangedEventArgs e) { var selection = ((ListBox)sender).SelectedItems[0]; if (selection != null) { LayerWrapper wrapper = null; foreach (var layer in mapLayers.Where(layer => layer.Name == (string)selection)) { wrapper = layer; } InvokeOverlayChanged(wrapper); } } public event OverlayChange OverlayChanged; public delegate void OverlayChange(LayerWrapper wrapper); public void InvokeOverlayChanged(LayerWrapper wrapper) { var handler = OverlayChanged; if (handler != null) { handler(wrapper); } } } }