using System; using System.Collections.Generic; using System.Text; using System.Collections; using OSGeo.MapGuide; using System.Collections.Specialized; namespace OSGeo.MapGuide.Viewer { /// /// A component that displays properties of selected features /// public interface IPropertyPane { /// /// Initializes the property pane from the given selection set /// /// void Init(MgSelectionSet set); /// /// Gets the current feature displayed on the property pane /// MgFeature CurrentFeature { get; } /// /// Raised when a request to zoom to the current selected feature has been made /// event EventHandler RequestZoomToCurrentFeature; } /// /// Represents a selected feature /// public class MgFeature { /// /// Gets or sets the geometry for this feature /// public MgGeometry Geometry { get; set; } /// /// Constructor /// public MgFeature() { this.Properties = new Hashtable(); } /// /// The attributes of this feature /// public IDictionary Properties { get; private set; } } /// /// Represents a set of selected features /// public class MgSelectionSet : IDisposable { private MgAgfReaderWriter _agfRw; /// /// Gets whether this selection set is empty /// public bool IsEmpty { get { return _features.Count == 0; } } /// /// Gest the number of features in this selection /// public int TotalCount { get { int total = 0; foreach (var list in _features.Values) { foreach (var feat in list) { total++; } } return total; } } /// /// Disposes of this instance /// public void Dispose() { if (_agfRw != null) { _agfRw.Dispose(); _agfRw = null; } foreach (var list in _features.Values) { foreach (var feat in list) { if (feat.Geometry != null) { feat.Geometry.Dispose(); feat.Geometry = null; } } } _features.Clear(); } private Dictionary> _features; /// /// Gets an array of layers that are included in this selection set /// public string[] LayerNames { get { return new List(_features.Keys).ToArray(); } } /// /// Gets an array of selected features that belong to the specified layer /// /// /// public MgFeature[] GetFeaturesForLayer(string layerName) { return _features[layerName].ToArray(); } /// /// Initializes a new instance of the class. /// /// The selection. public MgSelectionSet(MgSelectionBase selection) : this(selection, null) { } internal MgSelectionSet(MgSelectionBase selection, MgMapViewerProvider provider) { _agfRw = new MgAgfReaderWriter(); _features = new Dictionary>(); var selLayers = selection.GetLayers(); if (selLayers != null) { for (int i = 0; i < selLayers.GetCount(); i++) { var layer = selLayers.GetItem(i); var clsName = layer.GetFeatureClassName(); int selCount = selection.GetSelectedFeaturesCount(layer, clsName); if (selCount == 0) { System.Diagnostics.Trace.TraceWarning("No items in selection set for this layer (" + layer.GetName() + "). Layer shouldn't be here then"); continue; } NameValueCollection mappings = (provider != null) ? provider.GetPropertyMappings(layer) : null; _features[layer.Name] = new List(); var reader = selection.GetSelectedFeatures(layer, layer.GetFeatureClassName(), false); while (reader.ReadNext()) { var feature = CreateFeatureFromReader(reader); if (mappings != null) PerformDisplayNameSubstitution(feature, mappings); _features[layer.Name].Add(feature); } reader.Close(); } } } private static void PerformDisplayNameSubstitution(MgFeature feature, NameValueCollection mappings) { var remove = new List(); foreach (var name in feature.Properties.Keys) { if (mappings[name.ToString()] == null) remove.Add(name.ToString()); } foreach (var name in remove) { feature.Properties.Remove(name); } foreach (var key in mappings.AllKeys) { object value = feature.Properties[key]; feature.Properties.Remove(key); feature.Properties[mappings[key]] = value; } } private MgFeature CreateFeatureFromReader(MgFeatureReader reader) { var feature = new MgFeature(); var hash = feature.Properties; for (int i = 0; i < reader.GetPropertyCount(); i++) { var pt = reader.GetPropertyType(i); //Skip un-presentable types if (pt == MgPropertyType.Null || pt == MgPropertyType.Raster || pt == MgPropertyType.Blob || pt == MgPropertyType.Feature || pt == MgPropertyType.Clob) continue; string name = reader.GetPropertyName(i); if (reader.IsNull(i)) { hash[name] = null; } else { switch (pt) { case MgPropertyType.Boolean: hash[name] = reader.GetBoolean(i); break; case MgPropertyType.Byte: hash[name] = reader.GetByte(i); break; case MgPropertyType.DateTime: { var dt = reader.GetDateTime(i); hash[name] = new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second, 0); } break; case MgPropertyType.Double: case MgPropertyType.Decimal: hash[name] = reader.GetDouble(i); break; case MgPropertyType.Int16: hash[name] = reader.GetInt16(i); break; case MgPropertyType.Int32: hash[name] = reader.GetInt32(i); break; case MgPropertyType.Int64: hash[name] = reader.GetInt64(i); break; case MgPropertyType.Single: hash[name] = reader.GetSingle(i); break; case MgPropertyType.String: hash[name] = reader.GetString(i); break; case MgPropertyType.Geometry: { MgByteReader agf = reader.GetGeometry(i); feature.Geometry = _agfRw.Read(agf); } break; } } } return feature; } } }