Skip to content

Commit 50be7ab

Browse files
authored
56-vbe-add-in Settings and About dialog (#60)
* UserSettingDialog (import from old AccUnit version) * About dialog * fix COM object release (MarshalReleaseComObject)
1 parent 23770bb commit 50be7ab

26 files changed

+1339
-114
lines changed

source/AccUnit/AccessCodeLib.AccUnit.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,8 +144,10 @@
144144
<Compile Include="CodeCoverage\CodeModuleTracker.cs" />
145145
<Compile Include="CodeCoverage\ICodeCoverageTracker.cs" />
146146
<Compile Include="CodeCoverage\ProcedureTracker.cs" />
147+
<Compile Include="Configuration\AccUnitInfo.cs" />
147148
<Compile Include="Configuration\ErrorTrappingObserver.cs" />
148149
<Compile Include="Integration\IgnoreInfo.cs" />
150+
<Compile Include="Integration\UserSettings.cs" />
149151
<Compile Include="Interfaces\IVBATestBuilder.cs" />
150152
<Compile Include="Interfaces\VbaErrorTrapping.cs" />
151153
<Compile Include="Integration\TestResultCollector.cs" />
@@ -250,6 +252,7 @@
250252
<DependentUpon>Settings.settings</DependentUpon>
251253
</Compile>
252254
<Compile Include="TestRunner\VbaTestRunner.cs" />
255+
<Compile Include="Tools\UserSettings.cs" />
253256
<Compile Include="Tools\VBA\AssemblyInfo.cs" />
254257
<Compile Include="Tools\ITestClassGenerator.cs" />
255258
<Compile Include="Tools\Templates\BuiltInTemplateSources.cs" />
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Diagnostics;
4+
using System.Linq;
5+
using System.Reflection;
6+
using System.Text;
7+
8+
namespace AccessCodeLib.AccUnit.Configuration
9+
{
10+
public class AccUnitInfo
11+
{
12+
public static string FileVersion
13+
{
14+
get
15+
{
16+
var version = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location);
17+
return version.FileVersion;
18+
}
19+
}
20+
21+
public static string Copyright
22+
{
23+
get
24+
{
25+
var version = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location);
26+
return version.LegalCopyright;
27+
}
28+
}
29+
}
30+
}

source/AccUnit/Configuration/Configurator.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
using AccessCodeLib.Common.VBIDETools;
33
using Microsoft.Vbe.Interop;
44
using System;
5+
using System.Diagnostics;
6+
using System.Reflection;
57
using System.Runtime.InteropServices;
68

79
namespace AccessCodeLib.AccUnit.Configuration
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
using AccessCodeLib.AccUnit.Properties;
2+
using AccessCodeLib.Common.Tools.Logging;
3+
using System;
4+
using System.ComponentModel;
5+
6+
namespace AccessCodeLib.AccUnit
7+
{
8+
public class UserSettings
9+
{
10+
#region Static members
11+
12+
/// <summary>
13+
/// Unloads the previously loaded instance provided via property Current.
14+
/// This method is mainly needed to support testing the singleton implementation in property Current.
15+
/// </summary>
16+
public static void UnloadCurrent()
17+
{
18+
_current = null;
19+
}
20+
21+
private static UserSettings _current;
22+
public static UserSettings Current
23+
{
24+
get
25+
{
26+
if (_current == null)
27+
{
28+
_current = new UserSettings();
29+
_current.Load();
30+
}
31+
return _current;
32+
}
33+
set
34+
{
35+
_current = value ?? throw new ArgumentNullException();
36+
}
37+
}
38+
39+
#endregion
40+
41+
private UserSettings()
42+
{
43+
}
44+
45+
public UserSettings Clone()
46+
{
47+
var clone = new UserSettings
48+
{
49+
ImportExportFolder = ImportExportFolder,
50+
SeparatorChar = SeparatorChar,
51+
SeparatorMaxLength = SeparatorMaxLength
52+
};
53+
return clone;
54+
}
55+
56+
#region Load/Save
57+
58+
private void Load()
59+
{
60+
using (new BlockLogger())
61+
{
62+
ImportExportFolder = Settings.Default.ImportExportFolder;
63+
SeparatorMaxLength = Settings.Default.SeparatorMaxLength;
64+
SeparatorChar = Settings.Default.SeparatorChar;
65+
}
66+
}
67+
68+
public void Save()
69+
{
70+
Settings.Default.ImportExportFolder = ImportExportFolder;
71+
Settings.Default.SeparatorMaxLength = SeparatorMaxLength;
72+
Settings.Default.SeparatorChar = SeparatorChar;
73+
Settings.Default.Save();
74+
}
75+
76+
#endregion
77+
78+
#region Setting Properties
79+
80+
private string _importExportFolder;
81+
public string ImportExportFolder
82+
{
83+
get
84+
{
85+
return _importExportFolder;
86+
}
87+
set
88+
{
89+
_importExportFolder = value.TrimEnd('\\', ' ').TrimStart();
90+
}
91+
}
92+
93+
[Category("Text output")]
94+
[DefaultValue(60)]
95+
[Description("")]
96+
// ReSharper disable MemberCanBePrivate.Global
97+
public int SeparatorMaxLength { get; set; }
98+
// ReSharper restore MemberCanBePrivate.Global
99+
100+
[Category("Text output")]
101+
[DefaultValue('-')]
102+
[Description("")]
103+
// ReSharper disable MemberCanBePrivate.Global
104+
public char SeparatorChar { get; set; }
105+
// ReSharper restore MemberCanBePrivate.Global
106+
107+
108+
#endregion
109+
}
110+
}

source/AccUnit/Properties/AssemblyInfo.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
[assembly: AssemblyConfiguration("")]
1010
[assembly: AssemblyCompany("access-codelib.net")]
1111
[assembly: AssemblyProduct("AccUnit")]
12-
[assembly: AssemblyCopyright("Copyright © 2024")]
12+
[assembly: AssemblyCopyright("© 2010-2024")]
1313
[assembly: AssemblyTrademark("")]
1414
[assembly: AssemblyCulture("")]
1515

@@ -31,5 +31,5 @@
3131
// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden,
3232
// indem Sie "*" wie unten gezeigt eingeben:
3333
// [assembly: AssemblyVersion("1.0.*")]
34-
[assembly: AssemblyVersion("0.9.9.0")]
35-
[assembly: AssemblyFileVersion("0.9.9.0")]
34+
[assembly: AssemblyVersion("0.9.10.0")]
35+
[assembly: AssemblyFileVersion("0.9.10.0")]
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
using AccessCodeLib.AccUnit.Properties;
2+
using AccessCodeLib.AccUnit.Tools.Templates;
3+
using AccessCodeLib.Common.Tools.Logging;
4+
using System;
5+
6+
namespace AccessCodeLib.AccUnit.Tools
7+
{
8+
public class UserSettings
9+
{
10+
#region Static members
11+
12+
/// <summary>
13+
/// Unloads the previously loaded instance provided via property Current.
14+
/// This method is mainly needed to support testing the singleton implementation in property Current.
15+
/// </summary>
16+
public static void UnloadCurrent()
17+
{
18+
_current = null;
19+
}
20+
21+
private static UserSettings _current;
22+
public static UserSettings Current
23+
{
24+
get
25+
{
26+
if (_current == null)
27+
{
28+
_current = new UserSettings();
29+
_current.Load();
30+
}
31+
return _current;
32+
}
33+
set
34+
{
35+
_current = value ?? throw new ArgumentNullException();
36+
}
37+
}
38+
39+
#endregion
40+
41+
private UserSettings()
42+
{
43+
}
44+
45+
public UserSettings Clone()
46+
{
47+
var clone = new UserSettings
48+
{
49+
TemplateFolder = TemplateFolder,
50+
TestTemplates = TestTemplates,
51+
UserDefinedTemplates = UserDefinedTemplates,
52+
TestMethodTemplate = TestMethodTemplate
53+
};
54+
return clone;
55+
}
56+
57+
#region Load/Save
58+
59+
private void Load()
60+
{
61+
using (new BlockLogger())
62+
{
63+
TemplateFolder = Settings.Default.TemplateFolder;
64+
TestMethodTemplate = GetTestMethodTemplate();
65+
TestTemplates = new TestTemplateCollection();
66+
UserDefinedTemplates = new TestTemplateCollection(TestTemplates.UserDefinedTemplates);
67+
}
68+
}
69+
70+
private static string GetTestMethodTemplate()
71+
{
72+
var savedTemplate = Settings.Default.TestMethodTemplate;
73+
return !string.IsNullOrEmpty(savedTemplate) ? savedTemplate : Resources.DefaultTestMethodTemplate;
74+
}
75+
76+
public void Save()
77+
{
78+
using (new BlockLogger())
79+
{
80+
Settings.Default.TestMethodTemplate = TestMethodTemplate;
81+
Settings.Default.TemplateFolder = TemplateFolder;
82+
Settings.Default.Save();
83+
UserDefinedTemplates.Save();
84+
TestTemplates = new TestTemplateCollection();
85+
}
86+
}
87+
88+
#endregion
89+
90+
#region Setting Properties
91+
92+
private string _templateFolder;
93+
public string TemplateFolder
94+
{
95+
get
96+
{
97+
return _templateFolder;
98+
}
99+
set
100+
{
101+
_templateFolder = value.TrimEnd('\\', ' ').TrimStart();
102+
}
103+
}
104+
105+
public TestTemplateCollection TestTemplates { get; private set; }
106+
public TestTemplateCollection UserDefinedTemplates { get; private set; }
107+
public string TestMethodTemplate { get; set; }
108+
109+
#endregion
110+
}
111+
}

source/Common/Common.VBIDETools/Commandbar/VbeCommandBarAdapter.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using Microsoft.Vbe.Interop;
44
using System;
55
using System.Collections.Generic;
6+
using System.Runtime.InteropServices;
67

78
namespace AccessCodeLib.Common.VBIDETools.Commandbar
89
{
@@ -15,7 +16,7 @@ public VbeCommandBarAdapter(VBE vbe)
1516
VBE = vbe;
1617
}
1718

18-
public VBE VBE { get; }
19+
public VBE VBE { get; private set; }
1920

2021
public CommandBar MenuBar
2122
{
@@ -61,12 +62,10 @@ private CommandBar GetCommandBar(int index)
6162
return foundControl.Index;
6263
}
6364
}
64-
// ReSharper disable EmptyGeneralCatchClause
6565
catch
6666
{
6767
// Don't mind if the control could not be found.
6868
}
69-
// ReSharper restore EmptyGeneralCatchClause
7069

7170
return null;
7271
}
@@ -114,17 +113,18 @@ protected virtual void Dispose(bool disposing)
114113

115114
using (new BlockLogger())
116115
{
117-
DisposeUnManagedResources();
118-
116+
DisposeUnmanagedResources();
119117
_disposed = true;
120118
}
121119
}
122120

123-
private void DisposeUnManagedResources()
121+
private void DisposeUnmanagedResources()
124122
{
125123
using (new BlockLogger())
126124
{
127-
125+
Marshal.ReleaseComObject(VBE);
126+
VBE = null;
127+
128128
// issue #77: (http://accunit.access-codelib.net/bugs/view.php?id=77)
129129
return;
130130
/*

source/Common/Common.VBIDETools/InvocationHelper.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,17 +45,22 @@ protected virtual void Dispose(bool disposing)
4545

4646
try
4747
{
48-
_target = null;
48+
if (_target != null)
49+
{
50+
//Marshal.ReleaseComObject(_target); // --> RCW error ... Why?
51+
_target = null;
52+
}
4953
}
5054
catch (Exception ex)
5155
{
5256
Logger.Log(ex.Message);
5357
}
5458

55-
// GC-Bereinigung wegen unmanaged res:
59+
// GC clean up (instead of Marshal.ReleaseComObject)
5660
GC.Collect();
5761
GC.WaitForPendingFinalizers();
5862
GC.Collect();
63+
GC.WaitForPendingFinalizers();
5964

6065
_disposed = true;
6166
}

0 commit comments

Comments
 (0)