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;