using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Collections;
#pragma warning disable 1591
namespace OSGeo.MapGuide.Viewer
{
///
/// A control that displays properties of selected features
///
[ToolboxItem(true)]
public partial class MgPropertyPane : UserControl, IPropertyPane
{
private string _countFmt;
///
/// Initializes a new instance of the class.
///
public MgPropertyPane()
{
InitializeComponent();
_countFmt = lblCount.Text;
cmbLayer.SelectedIndexChanged += new EventHandler(OnSelectionLayerChanged);
}
private MgSelectionSet _sset;
///
/// Initializes the property pane from the given selection set
///
///
public void Init(MgSelectionSet set)
{
propGrid.SelectedObject = null;
featureToolStrip.Visible = false;
if (_sset != null)
{
_sset.Dispose();
_sset = null;
cmbLayer.Items.Clear();
_currentLayerFeatures.Clear();
}
_sset = set;
var layerNames = _sset.LayerNames;
cmbLayer.Items.AddRange(layerNames);
if (layerNames.Length > 0)
cmbLayer.SelectedIndex = 0;
controlToolStrip.Visible = (layerNames.Length > 0);
}
///
/// Gets the current feature displayed on the property pane
///
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public MgFeature CurrentFeature
{
get
{
var idx = this.CurrentSelectedFeatureIndex;
if (idx >= 0)
return _currentLayerFeatures[idx];
return null;
}
}
void OnSelectedFeatureChanged()
{
var feat = this.CurrentFeature;
if (feat != null)
{
propGrid.SelectedObject = new MgDictionaryPropertyGridAdapter(feat.Properties);
}
}
private List _currentLayerFeatures = new List();
void OnSelectionLayerChanged(object sender, EventArgs e)
{
if (cmbLayer.SelectedItem != null)
{
var layerName = cmbLayer.SelectedItem.ToString();
_currentLayerFeatures.Clear();
foreach (var feat in _sset.GetFeaturesForLayer(layerName))
{
_currentLayerFeatures.Add(feat);
}
if (_currentLayerFeatures.Count > 0)
{
lblCount.Text = string.Format(_countFmt, _currentLayerFeatures.Count);
featureToolStrip.Visible = true;
this.CurrentSelectedFeatureIndex = 0;
}
else
{
featureToolStrip.Visible = false;
}
}
}
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
internal int CurrentSelectedFeatureIndex
{
get
{
int idx;
if (int.TryParse(txtPosition.Text, out idx))
return idx - 1;
return 0;
}
set
{
txtPosition.Text = (value + 1).ToString();
OnSelectedFeatureChanged();
}
}
///
/// Raised when a request to zoom to the current selected feature has been made
///
[Category("MapGuide Viewer")] //NOXLATE
[Description("Raised when the zoom to current feature toolbar button is clicked")] //NOXLATE
public event EventHandler RequestZoomToCurrentFeature;
private void btnZoomCurrent_Click(object sender, EventArgs e)
{
if (this.CurrentFeature != null)
{
var handler = this.RequestZoomToCurrentFeature;
if (handler != null)
handler(this, EventArgs.Empty);
}
}
private void btnPrevFeature_Click(object sender, EventArgs e)
{
var idx = this.CurrentSelectedFeatureIndex;
if (idx > 0)
{
idx--;
}
else
{
idx = 0;
}
this.CurrentSelectedFeatureIndex = idx;
}
private void btnNextFeature_Click(object sender, EventArgs e)
{
var idx = this.CurrentSelectedFeatureIndex;
if (idx < 0)
{
idx = 0;
}
else
{
if (idx < _currentLayerFeatures.Count - 1)
idx++;
else
idx = _currentLayerFeatures.Count - 1;
}
this.CurrentSelectedFeatureIndex = idx;
}
internal void SetLanguage(System.Globalization.CultureInfo lang)
{
ComponentResourceManager resources = new ComponentResourceManager(this.GetType());
ApplyResourceToControl(resources, this, lang);
resources.ApplyResources(this, "$this", lang);
//NOTE: These will slip under the radar of the above call because they aren't direct children
resources.ApplyResources(btnNextFeature, btnNextFeature.Name, lang);
resources.ApplyResources(btnPrevFeature, btnPrevFeature.Name, lang);
resources.ApplyResources(lblCount, lblCount.Name, lang);
resources.ApplyResources(btnZoomSelectedFeature, btnZoomSelectedFeature.Name, lang);
}
private static void ApplyResourceToControl(ComponentResourceManager resources, Control control, System.Globalization.CultureInfo lang)
{
foreach (Control c in control.Controls)
{
ApplyResourceToControl(resources, c, lang);
resources.ApplyResources(c, c.Name, lang);
}
}
}
///
/// An adapter that allows an to be presented
/// in a
///
public class MgDictionaryPropertyGridAdapter : ICustomTypeDescriptor
{
IDictionary _dictionary;
public MgDictionaryPropertyGridAdapter(IDictionary d)
{
_dictionary = d;
}
public string GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this, true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
ArrayList properties = new ArrayList();
foreach (DictionaryEntry e in _dictionary)
{
properties.Add(new DictionaryPropertyDescriptor(_dictionary, e.Key));
}
PropertyDescriptor[] props =
(PropertyDescriptor[])properties.ToArray(typeof(PropertyDescriptor));
return new PropertyDescriptorCollection(props);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
EventDescriptorCollection System.ComponentModel.ICustomTypeDescriptor.GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return _dictionary;
}
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return null;
}
PropertyDescriptorCollection
System.ComponentModel.ICustomTypeDescriptor.GetProperties()
{
return ((ICustomTypeDescriptor)this).GetProperties(new Attribute[0]);
}
}
internal class DictionaryPropertyDescriptor : PropertyDescriptor
{
IDictionary _dictionary;
object _key;
internal DictionaryPropertyDescriptor(IDictionary d, object key)
: base(key.ToString(), null)
{
_dictionary = d;
_key = key;
}
public override Type PropertyType
{
get
{
if (_dictionary[_key] != null)
{
return _dictionary[_key].GetType();
}
else
{
return typeof(object);
}
}
}
public override void SetValue(object component, object value)
{
_dictionary[_key] = value;
}
public override object GetValue(object component)
{
return _dictionary[_key];
}
public override bool IsReadOnly
{
get { return true; } //Property Pane values are not editable
}
public override Type ComponentType
{
get { return null; }
}
public override bool CanResetValue(object component)
{
return false;
}
public override void ResetValue(object component)
{
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
}
}