Index: Core/GIS/src/Core.GIS.SharpMap.Api/Layers/ILayer.cs =================================================================== diff -u -r9f01c4daf5b7af6549045ed6ac404d18419c2555 -r5869dc3e57dfc3f16d35a28154f7304c66952906 --- Core/GIS/src/Core.GIS.SharpMap.Api/Layers/ILayer.cs (.../ILayer.cs) (revision 9f01c4daf5b7af6549045ed6ac404d18419c2555) +++ Core/GIS/src/Core.GIS.SharpMap.Api/Layers/ILayer.cs (.../ILayer.cs) (revision 5869dc3e57dfc3f16d35a28154f7304c66952906) @@ -18,6 +18,7 @@ using System; using System.Collections.Generic; using System.Drawing; +using Core.Common.Utils; using Core.GIS.GeoAPI.CoordinateSystems; using Core.GIS.GeoAPI.CoordinateSystems.Transformations; using Core.GIS.GeoAPI.Extensions.Feature; @@ -29,7 +30,7 @@ /// /// Interface for map layers /// - public interface ILayer : ICloneable, IDisposable + public interface ILayer : ICloneable, IDisposable, INotifyPropertyChange { /// /// Image of the layer for current map, layer uses it to render it's content to. Index: Core/GIS/src/Core.GIS.SharpMap/Layers/LabelLayer.cs =================================================================== diff -u -r3e304a168a08596346b343a6b7455c09faf4c3a1 -r5869dc3e57dfc3f16d35a28154f7304c66952906 --- Core/GIS/src/Core.GIS.SharpMap/Layers/LabelLayer.cs (.../LabelLayer.cs) (revision 3e304a168a08596346b343a6b7455c09faf4c3a1) +++ Core/GIS/src/Core.GIS.SharpMap/Layers/LabelLayer.cs (.../LabelLayer.cs) (revision 5869dc3e57dfc3f16d35a28154f7304c66952906) @@ -70,7 +70,6 @@ private GetLabelMethod getLabelMethod; private SmoothingMode smoothingMode; private TextRenderingHint textRenderingHint; - private ITheme theme; private string labelColumn; private string rotationColumn; private int priority; @@ -203,37 +202,6 @@ } /// - /// Gets or sets thematic settings for the layer. Set to null to ignore thematics - /// - public virtual ITheme Theme - { - get - { - return theme; - } - set - { - OnPropertyChanging("Theme"); - - if (theme != null) - { - theme.PropertyChanging -= OnPropertyChanging; - theme.PropertyChanged -= OnPropertyChanged; - } - - theme = value; - - if (theme != null) - { - theme.PropertyChanging += OnPropertyChanging; - theme.PropertyChanged += OnPropertyChanged; - } - - OnPropertyChanged("Theme"); - } - } - - /// /// Data column or expression where label text is extracted from. /// /// Index: Core/GIS/src/Core.GIS.SharpMap/Layers/Layer.cs =================================================================== diff -u -r8fdd5ce0ff4590589a7671851030fccc511f2bd0 -r5869dc3e57dfc3f16d35a28154f7304c66952906 --- Core/GIS/src/Core.GIS.SharpMap/Layers/Layer.cs (.../Layer.cs) (revision 8fdd5ce0ff4590589a7671851030fccc511f2bd0) +++ Core/GIS/src/Core.GIS.SharpMap/Layers/Layer.cs (.../Layer.cs) (revision 5869dc3e57dfc3f16d35a28154f7304c66952906) @@ -23,8 +23,6 @@ using System.Drawing.Imaging; using System.Linq; using Core.Common.Base; -using Core.Common.Utils.Aop; -using Core.Common.Utils.Aop.Markers; using Core.GIS.GeoAPI.CoordinateSystems; using Core.GIS.GeoAPI.CoordinateSystems.Transformations; using Core.GIS.GeoAPI.Extensions.Feature; @@ -47,7 +45,6 @@ /// Abstract class for common layer properties /// Implement this class instead of the ILayer interface to save a lot of common code. /// - [Entity(FireOnCollectionChange = false)] public abstract class Layer : ILayer { #region Delegates @@ -80,9 +77,7 @@ private Image image; private double lastRenderDuration; - [NoNotifyPropertyChange] private IMap map; - private bool renderRequired; private bool showInLegend = true; private bool showInTreeView = true; @@ -94,6 +89,21 @@ private ICoordinateTransformation coordinateTransformation; + protected bool themeIsDirty; + private bool canBeRemovedByUser = true; + private int renderOrder; + private float opacity; + private bool readOnly; + private bool skipRenderingOfVerySmallFeatures; + private bool useQuadTree; + private bool useSimpleGeometryForQuadTree; + private IFeatureEditor featureEditor; + private string themeGroup; + private bool nameIsReadOnly; + private bool excludeFromMapExtent; + private double minVisible; + private bool selectable; + protected Layer() { Opacity = 1.0f; @@ -117,8 +127,12 @@ } set { + OnPropertyChanging("CoordinateTransformation"); + tree = null; // reset quad tree coordinateTransformation = value; + + OnPropertyChanged("CoordinateTransformation"); } } @@ -130,7 +144,6 @@ } } - [NoNotifyPropertyChange] public virtual bool ThemeIsDirty { get @@ -160,13 +173,26 @@ } set { + OnPropertyChanging("LabelLayer"); + + if (labelLayer != null) + { + labelLayer.PropertyChanging -= OnPropertyChanging; + labelLayer.PropertyChanged -= OnPropertyChanged; + } + labelLayer = value; if (labelLayer != null) { + labelLayer.PropertyChanging += OnPropertyChanging; + labelLayer.PropertyChanged += OnPropertyChanged; + labelLayer.Parent = this; labelLayer.Map = map; } + + OnPropertyChanged("LabelLayer"); } } @@ -299,15 +325,18 @@ } set { + OnPropertyChanging("Name"); + if (NameIsReadOnly) { throw new ReadOnlyException("Property Name of Layer is not editable because NameIsReadOnly is true."); } name = value; + + OnPropertyChanged("Name"); } } - [NoNotifyPropertyChange] public virtual IMap Map { get @@ -328,7 +357,6 @@ } } - [NoNotifyPropertyChange] public virtual bool ShowLabels { get @@ -354,7 +382,9 @@ } set { + OnPropertyChanging("ShowInLegend"); showInLegend = value; + OnPropertyChanged("ShowInLegend"); } } @@ -366,7 +396,9 @@ } set { + OnPropertyChanging("ShowInTreeView"); showInTreeView = value; + OnPropertyChanged("ShowInTreeView"); } } @@ -378,11 +410,25 @@ } set { + OnPropertyChanging("ShowAttributeTable"); showAttributeTable = value; + OnPropertyChanged("ShowAttributeTable"); } } - public virtual int RenderOrder { get; set; } + public virtual int RenderOrder + { + get + { + return renderOrder; + } + set + { + OnPropertyChanging("RenderOrder"); + renderOrder = value; + OnPropertyChanged("RenderOrder"); + } + } public virtual bool CanBeRemovedByUser { @@ -392,21 +438,59 @@ } set { + OnPropertyChanging("CanBeRemovedByUser"); canBeRemovedByUser = value; + OnPropertyChanged("CanBeRemovedByUser"); } } /// /// Defines the layer opacity, expressed as a value between 0.0 and 1.0. A value of 0.0 indicates fully transparent. /// - public virtual float Opacity { get; set; } + public virtual float Opacity + { + get + { + return opacity; + } + set + { + OnPropertyChanging("Opacity"); + opacity = value; + OnPropertyChanged("Opacity"); + } + } - public virtual bool ReadOnly { get; set; } + public virtual bool ReadOnly + { + get + { + return readOnly; + } + set + { + OnPropertyChanging("ReadOnly"); + readOnly = value; + OnPropertyChanged("ReadOnly"); + } + } /// /// Performance. When true - very small features are not rendered (if implemented by feature povider). /// - public virtual bool SkipRenderingOfVerySmallFeatures { get; set; } + public virtual bool SkipRenderingOfVerySmallFeatures + { + get + { + return skipRenderingOfVerySmallFeatures; + } + set + { + OnPropertyChanging("SkipRenderingOfVerySmallFeatures"); + skipRenderingOfVerySmallFeatures = value; + OnPropertyChanged("SkipRenderingOfVerySmallFeatures"); + } + } public virtual ICoordinateSystem CoordinateSystem { @@ -416,16 +500,44 @@ } set { + OnPropertyChanging("CoordinateSystem"); + if (dataSource != null) { dataSource.CoordinateSystem = value; } + + OnPropertyChanged("CoordinateSystem"); } } - public virtual bool UseQuadTree { get; set; } + public virtual bool UseQuadTree + { + get + { + return useQuadTree; + } + set + { + OnPropertyChanging("UseQuadTree"); + useQuadTree = value; + OnPropertyChanged("UseQuadTree"); + } + } - public virtual bool UseSimpleGeometryForQuadTree { get; set; } + public virtual bool UseSimpleGeometryForQuadTree + { + get + { + return useSimpleGeometryForQuadTree; + } + set + { + OnPropertyChanging("UseSimpleGeometryForQuadTree"); + useSimpleGeometryForQuadTree = value; + OnPropertyChanged("UseSimpleGeometryForQuadTree"); + } + } public virtual QuadTree QuadTree { @@ -875,6 +987,8 @@ } set { + OnPropertyChanging("RenderQuadTree"); + renderQuadTree = value; if (value && quadTreeQuadLayers.Count == 0 && tree != null) @@ -886,6 +1000,8 @@ { RemoveQuadTreeLayers(); } + + OnPropertyChanged("RenderQuadTree"); } } @@ -899,6 +1015,8 @@ } set { + OnPropertyChanging("RenderQuadTreeEnvelopes"); + renderQuadTreeEnvelopes = value; if (value && quadTreeEnvelopesLayer == null && tree != null) @@ -910,6 +1028,8 @@ { RemoveQuadTreeEnvelopesLayer(); } + + OnPropertyChanged("RenderQuadTreeEnvelopes"); } } @@ -923,6 +1043,8 @@ } set { + OnPropertyChanging("DataSource"); + if (dataSource != null) { dataSource.FeaturesChanged -= DataSourceFeaturesChanged; @@ -950,6 +1072,8 @@ SkipRenderingOfVerySmallFeatures = true; } } + + OnPropertyChanged("DataSource"); } } @@ -981,7 +1105,19 @@ throw new NotImplementedException(); } - public virtual IFeatureEditor FeatureEditor { get; set; } + public virtual IFeatureEditor FeatureEditor + { + get + { + return featureEditor; + } + set + { + OnPropertyChanging("FeatureEditor"); + featureEditor = value; + OnPropertyChanged("FeatureEditor"); + } + } protected virtual void DataSourceFeaturesChanged(object sender, EventArgs e) { @@ -997,7 +1133,19 @@ private LayerAttribute minMaxCache; - public virtual string ThemeGroup { get; set; } + public virtual string ThemeGroup + { + get + { + return themeGroup; + } + set + { + OnPropertyChanging("ThemeGroup"); + themeGroup = value; + OnPropertyChanged("ThemeGroup"); + } + } public virtual double MinDataValue { @@ -1041,7 +1189,23 @@ } set { + OnPropertyChanging("Theme"); + + if (theme != null) + { + theme.PropertyChanging -= OnPropertyChanging; + theme.PropertyChanged -= OnPropertyChanged; + } + theme = value; + + if (theme != null) + { + theme.PropertyChanging += OnPropertyChanging; + theme.PropertyChanged += OnPropertyChanged; + } + + OnPropertyChanging("Theme"); } } @@ -1053,7 +1217,19 @@ //public abstract SharpMap.CoordinateSystems.CoordinateSystem CoordinateSystem { get; set; } - public virtual bool NameIsReadOnly { get; set; } + public virtual bool NameIsReadOnly + { + get + { + return nameIsReadOnly; + } + set + { + OnPropertyChanging("NameIsReadOnly"); + nameIsReadOnly = value; + OnPropertyChanged("NameIsReadOnly"); + } + } public virtual void ClearImage() { @@ -1064,7 +1240,19 @@ } } - public virtual bool ExcludeFromMapExtent { get; set; } + public virtual bool ExcludeFromMapExtent + { + get + { + return excludeFromMapExtent; + } + set + { + OnPropertyChanging("ExcludeFromMapExtent"); + excludeFromMapExtent = value; + OnPropertyChanged("ExcludeFromMapExtent"); + } + } public virtual void Render() { @@ -1132,11 +1320,12 @@ } set { + OnPropertyChanging("CustomRenderers"); customRenderers = value; + OnPropertyChanged("CustomRenderers"); } } - [NoNotifyPropertyChange] public virtual bool RenderRequired { get @@ -1149,7 +1338,6 @@ } } - [NoNotifyPropertyChange] public virtual double LastRenderDuration { get @@ -1212,7 +1400,19 @@ /// /// Minimum visibility zoom, including this value /// - public virtual double MinVisible { get; set; } + public virtual double MinVisible + { + get + { + return minVisible; + } + set + { + OnPropertyChanging("MinVisible"); + minVisible = value; + OnPropertyChanged("MinVisible"); + } + } /// /// Maximum visibility zoom, excluding this value @@ -1225,7 +1425,9 @@ } set { + OnPropertyChanging("MaxVisible"); maxVisible = value; + OnPropertyChanged("MaxVisible"); } } @@ -1240,7 +1442,9 @@ } set { + OnPropertyChanging("Visible"); visible = value; + OnPropertyChanged("Visible"); } } @@ -1257,15 +1461,23 @@ } } - protected bool themeIsDirty; - private bool canBeRemovedByUser = true; + public virtual bool Selectable + { + get + { + return selectable; + } + set + { + OnPropertyChanging("Selectable"); + selectable = value; + OnPropertyChanged("Selectable"); + } + } - public virtual bool Selectable { get; set; } - /// /// Determines whether the current theme should be updated when the datasouce changes /// - [NoNotifyPropertyChange] //don't notify..messes up serialization public virtual bool AutoUpdateThemeOnDataSourceChanged { get; set; } #endregion Index: Core/GIS/src/Core.GIS.SharpMap/Layers/VectorLayer.cs =================================================================== diff -u -r8fdd5ce0ff4590589a7671851030fccc511f2bd0 -r5869dc3e57dfc3f16d35a28154f7304c66952906 --- Core/GIS/src/Core.GIS.SharpMap/Layers/VectorLayer.cs (.../VectorLayer.cs) (revision 8fdd5ce0ff4590589a7671851030fccc511f2bd0) +++ Core/GIS/src/Core.GIS.SharpMap/Layers/VectorLayer.cs (.../VectorLayer.cs) (revision 5869dc3e57dfc3f16d35a28154f7304c66952906) @@ -57,7 +57,7 @@ /// System.Drawing.Image mapImage = myMap.GetMap(); /// /// - public class VectorLayer : Layer, INotifyPropertyChange + public class VectorLayer : Layer { public static readonly Bitmap DefaultPointSymbol = (Bitmap) Image.FromStream(Assembly.GetExecutingAssembly().GetManifestResourceStream("Core.GIS.SharpMap.Styles.DefaultSymbol.png")); private static readonly ILog log = LogManager.GetLogger(typeof(VectorLayer)); Index: Core/GIS/test/Core.GIS.SharpMap.Tests/Core.GIS.SharpMap.Tests.csproj =================================================================== diff -u -ra60bbf1de4ed3d809e8325c0b7359f7786f4a16d -r5869dc3e57dfc3f16d35a28154f7304c66952906 --- Core/GIS/test/Core.GIS.SharpMap.Tests/Core.GIS.SharpMap.Tests.csproj (.../Core.GIS.SharpMap.Tests.csproj) (revision a60bbf1de4ed3d809e8325c0b7359f7786f4a16d) +++ Core/GIS/test/Core.GIS.SharpMap.Tests/Core.GIS.SharpMap.Tests.csproj (.../Core.GIS.SharpMap.Tests.csproj) (revision 5869dc3e57dfc3f16d35a28154f7304c66952906) @@ -124,6 +124,7 @@ + Index: Core/GIS/test/Core.GIS.SharpMap.Tests/Layers/GroupLayerTest.cs =================================================================== diff -u -rbd67946f192eeda84e18c1d2842b9f20e39dfaf8 -r5869dc3e57dfc3f16d35a28154f7304c66952906 --- Core/GIS/test/Core.GIS.SharpMap.Tests/Layers/GroupLayerTest.cs (.../GroupLayerTest.cs) (revision bd67946f192eeda84e18c1d2842b9f20e39dfaf8) +++ Core/GIS/test/Core.GIS.SharpMap.Tests/Layers/GroupLayerTest.cs (.../GroupLayerTest.cs) (revision 5869dc3e57dfc3f16d35a28154f7304c66952906) @@ -11,7 +11,6 @@ public class GroupLayerTest { [Test] - [Ignore("WTI-81 | Will be activated (and will run correctly) when Entity is removed from Layer")] public void EnablingChildLayerBubblesOnePropertyChangedEvent() { //this is needed to let the mapcontrol refresh see issue 2749 Index: Core/GIS/test/Core.GIS.SharpMap.Tests/Layers/LabelLayerTest.cs =================================================================== diff -u -r3e304a168a08596346b343a6b7455c09faf4c3a1 -r5869dc3e57dfc3f16d35a28154f7304c66952906 --- Core/GIS/test/Core.GIS.SharpMap.Tests/Layers/LabelLayerTest.cs (.../LabelLayerTest.cs) (revision 3e304a168a08596346b343a6b7455c09faf4c3a1) +++ Core/GIS/test/Core.GIS.SharpMap.Tests/Layers/LabelLayerTest.cs (.../LabelLayerTest.cs) (revision 5869dc3e57dfc3f16d35a28154f7304c66952906) @@ -1,11 +1,8 @@ -using System.ComponentModel; using System.Drawing; using Core.GIS.GeoAPI.Extensions.Feature; using Core.GIS.NetTopologySuite.Extensions.Features; -using Core.GIS.SharpMap.Api; using Core.GIS.SharpMap.Data.Providers; using Core.GIS.SharpMap.Layers; -using Core.GIS.SharpMap.Rendering.Thematics; using NUnit.Framework; using SharpTestsEx; using Point = Core.GIS.NetTopologySuite.Geometries.Point; @@ -66,27 +63,6 @@ .Should("labels of 2 simple feature rendered").Be.EqualTo(2); } - [Test] - [Ignore("WTI-81 | Will be activated (and will run correctly) when Entity is removed from Layer")] - public void LabelLayersBubblesPropertyChangesOfTheme() - { - var counter = 0; - var theme = new CategorialTheme(); - var labelLayer = new LabelLayer { Theme = theme }; - - ((INotifyPropertyChanged) labelLayer).PropertyChanged += (sender, e) => - { - if (sender is ITheme) - { - counter++; - } - }; - - theme.AttributeName = "Test"; - - Assert.AreEqual(1, counter); - } - private class SimpleFeature : Feature { public int Data { get; set; } Index: Core/GIS/test/Core.GIS.SharpMap.Tests/Layers/LayerTest.cs =================================================================== diff -u --- Core/GIS/test/Core.GIS.SharpMap.Tests/Layers/LayerTest.cs (revision 0) +++ Core/GIS/test/Core.GIS.SharpMap.Tests/Layers/LayerTest.cs (revision 5869dc3e57dfc3f16d35a28154f7304c66952906) @@ -0,0 +1,58 @@ +using System.ComponentModel; +using Core.GIS.SharpMap.Api; +using Core.GIS.SharpMap.Api.Layers; +using Core.GIS.SharpMap.Layers; +using Core.GIS.SharpMap.Rendering.Thematics; +using NUnit.Framework; + +namespace Core.GIS.SharpMap.Tests.Layers +{ + [TestFixture] + public class LayerTest + { + [Test] + public void LayerBubblesPropertyChangesOfTheme() + { + var counter = 0; + var theme = new CategorialTheme(); + var testLayer = new TestLayer { Theme = theme }; + + ((INotifyPropertyChanged) testLayer).PropertyChanged += (sender, e) => + { + if (sender is ITheme) + { + counter++; + } + }; + + theme.AttributeName = "Test"; + + Assert.AreEqual(1, counter); + } + + [Test] + public void LayerBubblesPropertyChangesOfLabelLayer() + { + var counter = 0; + var labelLayer = new LabelLayer(); + var testLayer = new TestLayer { LabelLayer = labelLayer }; + + ((INotifyPropertyChanged) testLayer).PropertyChanged += (sender, e) => + { + if (sender is ILabelLayer) + { + counter++; + } + }; + + labelLayer.Priority = 1; + + Assert.AreEqual(1, counter); + } + + private class TestLayer : Layer + { + + } + } +} Index: Core/GIS/test/Core.GIS.SharpMap.Tests/Layers/VectorLayerTest.cs =================================================================== diff -u -rb5ed87e6d7fc6ad6f5fbae5e448abe61e26daeb3 -r5869dc3e57dfc3f16d35a28154f7304c66952906 --- Core/GIS/test/Core.GIS.SharpMap.Tests/Layers/VectorLayerTest.cs (.../VectorLayerTest.cs) (revision b5ed87e6d7fc6ad6f5fbae5e448abe61e26daeb3) +++ Core/GIS/test/Core.GIS.SharpMap.Tests/Layers/VectorLayerTest.cs (.../VectorLayerTest.cs) (revision 5869dc3e57dfc3f16d35a28154f7304c66952906) @@ -29,7 +29,6 @@ } [Test] - [Ignore("WTI-81 | Will be activated (and will run correctly) when Entity is removed from Layer")] public void EventBubbling() { var style = new VectorStyle(); @@ -203,7 +202,6 @@ } [Test] - [Ignore("WTI-81 | Will be activated (and will run correctly) when Entity is removed from Layer")] public void VectorLayersBubblesPropertyChangesOfStyle() { var counter = 0; Index: Core/GIS/test/Core.GIS.SharpMap.Tests/MapTest.cs =================================================================== diff -u -rb5ed87e6d7fc6ad6f5fbae5e448abe61e26daeb3 -r5869dc3e57dfc3f16d35a28154f7304c66952906 --- Core/GIS/test/Core.GIS.SharpMap.Tests/MapTest.cs (.../MapTest.cs) (revision b5ed87e6d7fc6ad6f5fbae5e448abe61e26daeb3) +++ Core/GIS/test/Core.GIS.SharpMap.Tests/MapTest.cs (.../MapTest.cs) (revision 5869dc3e57dfc3f16d35a28154f7304c66952906) @@ -27,7 +27,7 @@ { //TODO: rename this test [Test] - [Ignore("WTI-81 | Will be activated (and will run correctly) when Entity is removed from Layer")] + [Ignore("WTI-81 | Will be activated (and will run correctly) when Entity is removed from Map")] public void EventBubbling2() { int changeCount = 0; @@ -50,7 +50,6 @@ //TODO: rename this test [Test] - [Ignore("WTI-81 | Will be activated (and will run correctly) when Entity is removed from Layer")] public void EventBubbling3() { int changeCount = 0;