Index: src/DeltaShell/DeltaShell.Plugins.SharpMapGis.Gui/Forms/VectorLayerAttributeTableView.cs =================================================================== diff -u -r8f6ae890fed8e8eae3a32f9c0498a10f82e0ddf9 -r5fc71a385897af92ccb092f2f969b5709afab85a --- src/DeltaShell/DeltaShell.Plugins.SharpMapGis.Gui/Forms/VectorLayerAttributeTableView.cs (.../VectorLayerAttributeTableView.cs) (revision 8f6ae890fed8e8eae3a32f9c0498a10f82e0ddf9) +++ src/DeltaShell/DeltaShell.Plugins.SharpMapGis.Gui/Forms/VectorLayerAttributeTableView.cs (.../VectorLayerAttributeTableView.cs) (revision 5fc71a385897af92ccb092f2f969b5709afab85a) @@ -19,12 +19,13 @@ using NetTopologySuite.Extensions.Features; using SharpMap.Api.Layers; using MessageBox = System.Windows.Forms.MessageBox; +using TypeConverter = DelftTools.Utils.TypeConverter; namespace DeltaShell.Plugins.SharpMapGis.Gui.Forms { public partial class VectorLayerAttributeTableView : UserControl, ILayerEditorView { - private TableView tableView; + public event EventHandler SelectedFeaturesChanged; private ILayer layer; private IList featureRowList; private bool removingFeatures; @@ -42,65 +43,56 @@ InitializeDynamicAttributeContextMenu(); // TODO: extend UpdateTableDataSource() to support add/delete new rows, via layer.FeatureEditor? - tableView.AllowAddNewRow = false; - - tableView.ReadOnlyCellBackColor = SystemColors.ControlLight; - tableView.ReadOnlyCellFilter = OnReadOnlyCellFilter; - tableView.RowDeleteHandler = OnDeleteRows; - } + TableView.AllowAddNewRow = false; - private bool OnDeleteRows() - { - if (DeleteSelectedFeatures == null) return false; - - DeleteSelectedFeatures(); - SelectedFeatures = Enumerable.Empty(); - return true; + TableView.ReadOnlyCellBackColor = SystemColors.ControlLight; + TableView.ReadOnlyCellFilter = OnReadOnlyCellFilter; + TableView.RowDeleteHandler = OnDeleteRows; } - private bool OnReadOnlyCellFilter(TableViewCell c) - { - if (c.Column.IsUnbound) - return false; + public Action ZoomToFeature { get; set; } - if (tableView.Data == null) return true; + public Action OpenViewMethod { get; set; } - var rowObjects = (IList) tableView.Data; - if (rowObjects.Count <= 0) - return true; + public Action DeleteSelectedFeatures { get; set; } - var dataSourceIndexByRowIndex = tableView.GetDataSourceIndexByRowIndex(c.RowIndex); - if (dataSourceIndexByRowIndex < 0) - return false; + public TableView TableView { get; private set; } - var rowObject = rowObjects[dataSourceIndexByRowIndex]; - - return DynamicReadOnlyAttribute.IsDynamicReadOnly(rowObject, c.Column.Name); + public Func DynamicAttributeVisible + { + private get + { + return dynamicAttributeVisible; + } + set + { + dynamicAttributeVisible = value; + UpdateTableDataSource(); + } } - /// - /// Optional factory method to create an object to be bound to the table view for a given feature. - /// - public void SetCreateFeatureRowFunction(Func createFeatureRowFunction) where TFeatureRow : class, IFeatureRowObject + public bool CanAddDeleteAttributes { - createFeatureRowObject = createFeatureRowFunction; - featureRowType = typeof (TFeatureRow); - - if (layer != null) + get { - UpdateTableDataSource(); + return canAddDeleteAttributes; } + set + { + if (canAddDeleteAttributes != value) + { + canAddDeleteAttributes = value; + InitializeDynamicAttributeContextMenu(); + } + } } - public Action ZoomToFeature { get; set; } - - public Action OpenViewMethod { get; set; } - - public Action DeleteSelectedFeatures { get; set; } - public object Data { - get { return layer; } + get + { + return layer; + } set { if (layer != null && layer.DataSource != null) @@ -119,21 +111,16 @@ } } - public TableView TableView - { - get { return tableView; } - } - public IEnumerable SelectedFeatures { get { if (layer.DataSource != null) { - var rowIndices = tableView.SelectedCells.Select(c => c.RowIndex).Distinct(); + var rowIndices = TableView.SelectedCells.Select(c => c.RowIndex).Distinct(); return rowIndices.Where(i => i >= 0) - .Select(i => layer.DataSource.Features[tableView.GetDataSourceIndexByRowIndex(i)]) + .Select(i => layer.DataSource.Features[TableView.GetDataSourceIndexByRowIndex(i)]) .OfType() .Where(f => f != null); } @@ -147,41 +134,99 @@ return; } - tableView.ClearSelection(); + TableView.ClearSelection(); var features = value.Where(f => f.GetType().Implements(layer.DataSource.FeatureType)).ToList(); if (features.Count == 0) { return; } - - tableView.SelectRows(features.Select(f => tableView.GetRowIndexByDataSourceIndex(layer.DataSource.Features.IndexOf(f))).ToArray()); - tableView.FocusedRowIndex = tableView.SelectedRowsIndices.FirstOrDefault(); + TableView.SelectRows(features.Select(f => TableView.GetRowIndexByDataSourceIndex(layer.DataSource.Features.IndexOf(f))).ToArray()); + + TableView.FocusedRowIndex = TableView.SelectedRowsIndices.FirstOrDefault(); } } public Image Image { get; set; } - public void EnsureVisible(object item) + public ViewInfo ViewInfo { get; set; } + public ILayer Layer { set; get; } + + /// + /// Optional factory method to create an object to be bound to the table view for a given feature. + /// + public void SetCreateFeatureRowFunction(Func createFeatureRowFunction) where TFeatureRow : class, IFeatureRowObject { + createFeatureRowObject = createFeatureRowFunction; + featureRowType = typeof(TFeatureRow); + + if (layer != null) + { + UpdateTableDataSource(); + } } - public ViewInfo ViewInfo { get; set; } + public void EnsureVisible(object item) {} + public void OnActivated() {} + + public void OnDeactivated() {} + + private bool OnDeleteRows() + { + if (DeleteSelectedFeatures == null) + { + return false; + } + + DeleteSelectedFeatures(); + SelectedFeatures = Enumerable.Empty(); + return true; + } + + private bool OnReadOnlyCellFilter(TableViewCell c) + { + if (c.Column.IsUnbound) + { + return false; + } + + if (TableView.Data == null) + { + return true; + } + + var rowObjects = (IList) TableView.Data; + if (rowObjects.Count <= 0) + { + return true; + } + + var dataSourceIndexByRowIndex = TableView.GetDataSourceIndexByRowIndex(c.RowIndex); + if (dataSourceIndexByRowIndex < 0) + { + return false; + } + + var rowObject = rowObjects[dataSourceIndexByRowIndex]; + + return DynamicReadOnlyAttribute.IsDynamicReadOnly(rowObject, c.Column.Name); + } + private void DataSourceFeaturesChanged(object sender, EventArgs e) { if (createFeatureRowObject == null) { - tableView.ScheduleRefresh(); + TableView.ScheduleRefresh(); } else if (!removingFeatures) { - tableView.SuspendDrawing(); - tableView.Data = null; // clear previous subscriptions (property changed) - tableView.Data = CreateFeatureRowList(layer.DataSource.Features); - tableView.ResumeDrawing(); + TableView.SuspendDrawing(); + TableView.Data = null; // clear previous subscriptions (property changed) + TableView.Data = CreateFeatureRowList(layer.DataSource.Features); + TableView.ResumeDrawing(); } } @@ -190,14 +235,14 @@ ConfigureStaticAttributeColumns(); ConfigureDynamicAttributeColumns(); - tableView.Data = createFeatureRowObject == null + TableView.Data = createFeatureRowObject == null ? layer.DataSource.Features : CreateFeatureRowList(layer.DataSource.Features); - tableView.AllowDeleteRow = !layer.ReadOnly && layer.FeatureEditor != null; + TableView.AllowDeleteRow = !layer.ReadOnly && layer.FeatureEditor != null; - tableView.RefreshData(); - tableView.BestFitColumns(); + TableView.RefreshData(); + TableView.BestFitColumns(); } private IList CreateFeatureRowList(IList features) @@ -206,7 +251,10 @@ // Create and initialize EventedList. Type needs to be the specific featureRowObject (binding needs the // type to get all the properties) - featureRowList = (IList) TypeUtils.CreateGeneric(typeof (EventedList<>), new[] {featureRowType}); + featureRowList = (IList) TypeUtils.CreateGeneric(typeof(EventedList<>), new[] + { + featureRowType + }); foreach (var featureRowObject in features.OfType().Select(createFeatureRowObject)) { @@ -225,7 +273,7 @@ return; } - ((INotifyCollectionChange)featureRowList).CollectionChanged -= FeatureRowListCollectionChanged; + ((INotifyCollectionChange) featureRowList).CollectionChanged -= FeatureRowListCollectionChanged; foreach (var featureRowObject in featureRowList.OfType()) { @@ -245,15 +293,15 @@ removingFeatures = true; var feature = ((IFeatureRowObject) e.Item).GetFeature(); - layer.FeatureEditor.CreateInteractor(layer,feature).Delete(); + layer.FeatureEditor.CreateInteractor(layer, feature).Delete(); removingFeatures = false; } private void ConfigureStaticAttributeColumns() { - tableView.Columns.Clear(); - tableView.AutoGenerateColumns = false; - + TableView.Columns.Clear(); + TableView.AutoGenerateColumns = false; + if (createFeatureRowObject == null) { var featureType = layer.DataSource.FeatureType; @@ -262,14 +310,14 @@ featureType.GetProperties(); // refresh property cache (ensure that the properties are always returned in the same order) var attributeNames = FeatureAttributeAccessorHelper.GetFeatureAttributeNames(featureType).ToList(); - + foreach (var name in attributeNames) { var displayName = FeatureAttributeAccessorHelper.GetPropertyDisplayName(featureType, name); var displayFormat = FeatureAttributeAccessorHelper.GetFormatString(featureType, name); var isReadOnly = FeatureAttributeAccessorHelper.IsReadOnly(featureType, name); - tableView.AddColumn(name, displayName ?? name, isReadOnly, 100, displayFormat: displayFormat); + TableView.AddColumn(name, displayName ?? name, isReadOnly, 100, displayFormat: displayFormat); } } else @@ -279,72 +327,51 @@ var customAttributes = propertyInfo.GetCustomAttributes(true); if (customAttributes.OfType().Any(a => !a.Browsable)) + { continue; + } var name = propertyInfo.Name; - + var displayName = customAttributes.OfType().Select(a => a.DisplayName).FirstOrDefault(); var displayFormat = customAttributes.OfType().Select(a => a.FormatString).FirstOrDefault(); var isReadOnly = FeatureAttributeAccessorHelper.IsReadOnly(featureRowType, name); - tableView.AddColumn(name, displayName ?? name, isReadOnly, 100, displayFormat: displayFormat); + TableView.AddColumn(name, displayName ?? name, isReadOnly, 100, displayFormat: displayFormat); } } } - public Func DynamicAttributeVisible - { - private get { return dynamicAttributeVisible; } - set - { - dynamicAttributeVisible = value; - UpdateTableDataSource(); - } - } - private bool IsVisible(string attributeKey) { return DynamicAttributeVisible == null || DynamicAttributeVisible(attributeKey); } private void ConfigureDynamicAttributeColumns() { - tableView.Columns.RemoveAllWhere(c => c.IsUnbound); + TableView.Columns.RemoveAllWhere(c => c.IsUnbound); var attributes = layer.DataSource.Features.Cast() - .Where(f => f.Attributes != null).SelectMany(feature => feature.Attributes.Keys) - .Distinct().Where(IsVisible); + .Where(f => f.Attributes != null).SelectMany(feature => feature.Attributes.Keys) + .Distinct().Where(IsVisible); - var index = tableView.Columns.Count; + var index = TableView.Columns.Count; foreach (var attribute in attributes) { var columnName = attribute; - var column = tableView.Columns.FirstOrDefault(c => c.Name == columnName); + var column = TableView.Columns.FirstOrDefault(c => c.Name == columnName); if (column != null) { continue; } - tableView.AddUnboundColumn(columnName, typeof(string), index++); + TableView.AddUnboundColumn(columnName, typeof(string), index++); } } - public bool CanAddDeleteAttributes - { - get { return canAddDeleteAttributes; } - set - { - if (canAddDeleteAttributes != value) - { - canAddDeleteAttributes = value; - InitializeDynamicAttributeContextMenu(); - } - } - } - private void InitializeDynamicAttributeContextMenu() { const string addAttributeItemName = "btnAddAttribute"; @@ -354,10 +381,10 @@ const string deleteAttributeCaption = "Delete Attribute"; const string zoomToItemCaption = "Zoom to item"; const string openViewCaption = "Open view..."; - + if (CanAddDeleteAttributes) { - if (tableView.RowContextMenu.Items.OfType().All(mi => mi.Name != addAttributeItemName)) + if (TableView.RowContextMenu.Items.OfType().All(mi => mi.Name != addAttributeItemName)) { var btnAddAttribute = new ToolStripMenuItem { @@ -366,21 +393,21 @@ Image = Resources.table_add }; btnAddAttribute.Click += AddAttributeItemClick; - btnAddAttribute.Tag = tableView; - tableView.RowContextMenu.Items.Add(btnAddAttribute); + btnAddAttribute.Tag = TableView; + TableView.RowContextMenu.Items.Add(btnAddAttribute); } } else { - if (tableView.RowContextMenu.Items.OfType() - .Any(mi => mi.Name == addAttributeItemName)) + if (TableView.RowContextMenu.Items.OfType() + .Any(mi => mi.Name == addAttributeItemName)) { - var menuItem = tableView.RowContextMenu.Items.OfType() - .First(mi => mi.Name == addAttributeItemName); - tableView.RowContextMenu.Items.Remove(menuItem); + var menuItem = TableView.RowContextMenu.Items.OfType() + .First(mi => mi.Name == addAttributeItemName); + TableView.RowContextMenu.Items.Remove(menuItem); } } - if (tableView.RowContextMenu.Items.OfType().All(mi => mi.Name != zoomItemName)) + if (TableView.RowContextMenu.Items.OfType().All(mi => mi.Name != zoomItemName)) { var btnzoomToMenuItem = new ToolStripMenuItem { @@ -389,10 +416,10 @@ Image = Resources.magnifier__arrow }; btnzoomToMenuItem.Click += BtnZoomToClick; - btnzoomToMenuItem.Tag = tableView; - tableView.RowContextMenu.Items.Add(btnzoomToMenuItem); + btnzoomToMenuItem.Tag = TableView; + TableView.RowContextMenu.Items.Add(btnzoomToMenuItem); } - if (tableView.RowContextMenu.Items.OfType().All(mi => mi.Name != openViewItemName)) + if (TableView.RowContextMenu.Items.OfType().All(mi => mi.Name != openViewItemName)) { var btnOpenViewMenuItem = new ToolStripMenuItem { @@ -401,45 +428,48 @@ Image = Resources.Properties }; btnOpenViewMenuItem.Click += BtnOpenViewClick; - btnOpenViewMenuItem.Tag = tableView; + btnOpenViewMenuItem.Tag = TableView; btnOpenViewMenuItem.Font = new Font(btnOpenViewMenuItem.Font, FontStyle.Bold); - tableView.RowContextMenu.Items.Add(btnOpenViewMenuItem); + TableView.RowContextMenu.Items.Add(btnOpenViewMenuItem); } - tableView.UnboundColumnData = TableViewUnboundColumnDataUpdating; + TableView.UnboundColumnData = TableViewUnboundColumnDataUpdating; if (CanAddDeleteAttributes) { - if (tableView.ColumnMenuItems.All(mi => mi.Caption != addAttributeCaption)) + if (TableView.ColumnMenuItems.All(mi => mi.Caption != addAttributeCaption)) { var addAttributeItem = new TableViewColumnMenuItem(addAttributeCaption) { Image = Resources.table_add }; addAttributeItem.Click += AddAttributeItemClick; - tableView.ColumnMenuItems.Add(addAttributeItem); + TableView.ColumnMenuItems.Add(addAttributeItem); } - if (tableView.ColumnMenuItems.All(mi => mi.Caption != deleteAttributeCaption)) + if (TableView.ColumnMenuItems.All(mi => mi.Caption != deleteAttributeCaption)) { var deleteAttributeItem = new TableViewColumnMenuItem(deleteAttributeCaption) { Image = Resources.table_delete }; deleteAttributeItem.Showing += DeleteAttributeItemShowing; deleteAttributeItem.Click += DeleteAttributeItemClick; - tableView.ColumnMenuItems.Add(deleteAttributeItem); + TableView.ColumnMenuItems.Add(deleteAttributeItem); } } else { - tableView.ColumnMenuItems.RemoveAllWhere( + TableView.ColumnMenuItems.RemoveAllWhere( mi => mi.Caption == addAttributeCaption || mi.Caption == deleteAttributeCaption); } - if (tableView.ColumnMenuItems.All(mi => mi.Caption != zoomToItemCaption)) + if (TableView.ColumnMenuItems.All(mi => mi.Caption != zoomToItemCaption)) { - var zoomToMenuItem = new TableViewColumnMenuItem(zoomToItemCaption) {Image = Resources.magnifier__arrow}; + var zoomToMenuItem = new TableViewColumnMenuItem(zoomToItemCaption) + { + Image = Resources.magnifier__arrow + }; zoomToMenuItem.Click += BtnZoomToClick; - tableView.ColumnMenuItems.Add(zoomToMenuItem); + TableView.ColumnMenuItems.Add(zoomToMenuItem); } } @@ -450,7 +480,7 @@ var column = sender as ITableViewColumn; //only show delete option if its a custom attribute - if (column != null && attributes.Any(a => a == column.Name)) + if (column != null && attributes.Any(a => a == column.Name)) { e.Cancel = false; return; @@ -468,7 +498,7 @@ } column.Visible = false; - tableView.Columns.Remove(column); + TableView.Columns.Remove(column); var attributeName = column.Name; @@ -480,8 +510,8 @@ } } - tableView.RefreshData(); - tableView.ResetBindings(); + TableView.RefreshData(); + TableView.ResetBindings(); } private void BtnZoomToClick(object sender, EventArgs e) @@ -504,12 +534,15 @@ private void AddAttributeItemClick(object sender, EventArgs e) { - if (tableView.FocusedRowIndex < 0) + if (TableView.FocusedRowIndex < 0) { return; } - var dialog = new InputTextDialog { Text = "Please give an attribute name" }; + var dialog = new InputTextDialog + { + Text = "Please give an attribute name" + }; if (dialog.ShowDialog() == DialogResult.OK) { var attributeName = dialog.EnteredText; @@ -533,21 +566,21 @@ } } ConfigureDynamicAttributeColumns(); - tableView.RefreshData(); + TableView.RefreshData(); } } private object TableViewUnboundColumnDataUpdating(int column, int dataSourceIndex, bool isGetData, bool isSetData, object value) { var featureIndex = dataSourceIndex; var feature = layer.DataSource.GetFeature(featureIndex); - - if (tableView.Columns.Count <= column) + + if (TableView.Columns.Count <= column) { return value; } - var attributeName = tableView.Columns[column].Name; + var attributeName = TableView.Columns[column].Name; if (feature.Attributes == null) { @@ -574,11 +607,11 @@ // match type object currentValue; - var type = typeof (string); + var type = typeof(string); if (feature.Attributes.TryGetValue(attributeName, out currentValue) && currentValue != null) { type = currentValue.GetType(); - feature.Attributes[attributeName] = DelftTools.Utils.TypeConverter.ConvertValueToTargetType(type,value); + feature.Attributes[attributeName] = TypeConverter.ConvertValueToTargetType(type, value); } else { @@ -594,17 +627,9 @@ private void TableViewSelectionChanged(object sender, TableSelectionChangedEventArgs e) { if (SelectedFeaturesChanged != null) + { SelectedFeaturesChanged(this, e); + } } - - public event EventHandler SelectedFeaturesChanged; - public ILayer Layer { set; get; } - public void OnActivated() - { - } - - public void OnDeactivated() - { - } } -} +} \ No newline at end of file