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;
}
}
}