Skip to content

Commit 1dd87de

Browse files
committed
Added BeforeSaveChanges event and BeforeClearChanges event to the GeometryEditor.
1 parent 239e723 commit 1dd87de

4 files changed

Lines changed: 87 additions & 7 deletions

File tree

src/MW5.Api/Concrete/GeometryEditor.cs

Lines changed: 81 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
using System;
2+
using System.ComponentModel;
23
using System.Drawing;
4+
using System.Runtime.CompilerServices;
35
using MapWinGIS;
46
using MW5.Api.Enums;
57
using MW5.Api.Helpers;
@@ -8,10 +10,80 @@
810

911
namespace MW5.Api.Concrete
1012
{
13+
1114
public class GeometryEditor: IGeometryEditor
1215
{
1316
private readonly ShapeEditor _editor;
1417

18+
private class CustomGeometryEditorEvents {
19+
public event EventHandler BeforeClearChangesEvent;
20+
internal void InvokeBeforeClearChangesEvent(object sender)
21+
=> BeforeClearChangesEvent?.Invoke(sender, new EventArgs());
22+
23+
public event CancelEventHandler BeforeSaveChangesEvent;
24+
internal bool InvokeBeforeSaveChangesEvent(object sender)
25+
{
26+
if (BeforeSaveChangesEvent != null)
27+
{
28+
var args = new CancelEventArgs();
29+
foreach (Delegate handler in BeforeSaveChangesEvent.GetInvocationList())
30+
{
31+
handler.DynamicInvoke(this, args);
32+
if (args.Cancel)
33+
{
34+
return false;
35+
}
36+
}
37+
}
38+
return true;
39+
}
40+
41+
// The C# GeometryEditor gets re-created on the fly each time it is accesed from the map.
42+
// This table maps the actual COM object to the correct events we've added.
43+
private static ConditionalWeakTable<object, object> eventDict = new ConditionalWeakTable<object, object>();
44+
internal static CustomGeometryEditorEvents Get(object _editor) {
45+
eventDict.TryGetValue(_editor, out var fetched);
46+
if (!(fetched is CustomGeometryEditorEvents events))
47+
{
48+
events = new CustomGeometryEditorEvents();
49+
eventDict.Remove(_editor);
50+
eventDict.Add(_editor, events);
51+
}
52+
return events;
53+
}
54+
}
55+
56+
57+
#region BeforeClearChangesEvent
58+
public event EventHandler BeforeClearChangesEvent
59+
{
60+
add
61+
{
62+
CustomGeometryEditorEvents.Get(_editor).BeforeClearChangesEvent += value;
63+
}
64+
remove
65+
{
66+
CustomGeometryEditorEvents.Get(_editor).BeforeClearChangesEvent -= value;
67+
}
68+
}
69+
protected virtual void RaiseBeforeClearChangesEvent() => CustomGeometryEditorEvents.Get(_editor).InvokeBeforeClearChangesEvent(this);
70+
#endregion
71+
72+
#region BeforeSaveChangesEvent
73+
public event CancelEventHandler BeforeSaveChangesEvent
74+
{
75+
add
76+
{
77+
CustomGeometryEditorEvents.Get(_editor).BeforeSaveChangesEvent += value;
78+
}
79+
remove
80+
{
81+
CustomGeometryEditorEvents.Get(_editor).BeforeSaveChangesEvent -= value;
82+
}
83+
}
84+
protected virtual bool RaiseBeforeSaveChangesEvent() => CustomGeometryEditorEvents.Get(_editor).InvokeBeforeSaveChangesEvent(this);
85+
#endregion
86+
1587
internal GeometryEditor(ShapeEditor editor)
1688
{
1789
_editor = editor;
@@ -128,11 +200,6 @@ public EditorValidation ValidationMode
128200
get { return (EditorValidation)_editor.ValidationMode; }
129201
set { _editor.ValidationMode = (tkEditorValidation)value; }
130202
}
131-
132-
public void Clear()
133-
{
134-
_editor.Clear();
135-
}
136203

137204
public void CopyStyleFrom(IGeometryStyle style)
138205
{
@@ -174,9 +241,17 @@ public bool AddPoint(ICoordinate pnt)
174241
return _editor.AddPoint((MapWinGIS.Point) pnt.InternalObject);
175242
}
176243

244+
public void Clear()
245+
{
246+
RaiseBeforeClearChangesEvent();
247+
_editor.Clear();
248+
}
249+
177250
public bool SaveChanges()
178251
{
179-
return _editor.SaveChanges();
252+
if (RaiseBeforeSaveChangesEvent())
253+
return _editor.SaveChanges();
254+
return false;
180255
}
181256

182257
public bool ShowArea

src/MW5.Api/Interfaces/IGeometryEditor.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
1+
using System;
2+
using System.ComponentModel;
13
using System.Drawing;
24
using MW5.Api.Enums;
35

46
namespace MW5.Api.Interfaces
57
{
68
public interface IGeometryEditor: IComWrapper
79
{
10+
event EventHandler BeforeClearChangesEvent;
11+
event CancelEventHandler BeforeSaveChangesEvent;
812
double Area { get; }
913
EditorBehavior EditorBehavior { get; set; }
1014
EditorState EditorState { get; }

src/MW5.Services/MW5.Services.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
<ItemGroup>
5656
<Reference Include="log4net, Version=2.0.8.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL">
5757
<HintPath>..\packages\log4net.2.0.8\lib\net45-full\log4net.dll</HintPath>
58+
<SpecificVersion>False</SpecificVersion>
5859
<Private>True</Private>
5960
</Reference>
6061
<Reference Include="Microsoft.CSharp" />

src/MW5/MW5.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363
<DefineConstants>DEBUG;TRACE</DefineConstants>
6464
<DebugType>full</DebugType>
6565
<PlatformTarget>x64</PlatformTarget>
66-
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
66+
<GenerateSerializationAssemblies>Auto</GenerateSerializationAssemblies>
6767
<ErrorReport>prompt</ErrorReport>
6868
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
6969
<Prefer32Bit>true</Prefer32Bit>

0 commit comments

Comments
 (0)