Skip to content

Commit 89ff040

Browse files
authored
Merge pull request #244 from tonyhallett/fix-coverage-colours-from-vs
Fix coverage colours from vs
2 parents 0622814 + 3eea0fb commit 89ff040

File tree

2 files changed

+45
-20
lines changed

2 files changed

+45
-20
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ If you are using option 1) then project and global options will only be used whe
114114

115115
#### Options
116116
```
117-
CoverageColoursFromFontsAndColours Specify true to use Environment / Fonts and Colors / Text Editor for editor Coverage colouring.
117+
CoverageColoursFromFontsAndColours Specify true to use Environment / Fonts and Colors / Text Editor for editor Coverage colouring ( if present).
118118
Coverage Touched Area / Coverage Not Touched Area / Coverage Partially Touched Area.
119119
When false colours used are Green, Red and Gold.
120120
Enabled Specifies whether or not coverage output is enabled

SharedProject/Impl/CoverageColorProvider.cs

Lines changed: 44 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -14,29 +14,37 @@ namespace FineCodeCoverage.Impl
1414
internal class CoverageColorProvider : ICoverageColoursProvider, ICoverageColours
1515
{
1616
private readonly IVsFontAndColorStorage fontAndColorStorage;
17-
private Guid categoryWithCoverage = Guid.Parse("ff349800-ea43-46c1-8c98-878e78f46501");
17+
private readonly ILogger logger;
1818
private readonly uint storeFlags = (uint)(__FCSTORAGEFLAGS.FCSF_READONLY | __FCSTORAGEFLAGS.FCSF_LOADDEFAULTS | __FCSTORAGEFLAGS.FCSF_NOAUTOCOLORS | __FCSTORAGEFLAGS.FCSF_PROPAGATECHANGES);
19-
private System.Windows.Media.Color defaultCoverageTouchedArea = System.Windows.Media.Colors.Green;
20-
private System.Windows.Media.Color defaultCoverageNotTouchedArea = System.Windows.Media.Colors.Red;
21-
private System.Windows.Media.Color defaultCoveragePartiallyTouchedArea = System.Windows.Media.Color.FromRgb(255, 165, 0);
19+
private readonly System.Windows.Media.Color defaultCoverageTouchedArea = System.Windows.Media.Colors.Green;
20+
private readonly System.Windows.Media.Color defaultCoverageNotTouchedArea = System.Windows.Media.Colors.Red;
21+
private readonly System.Windows.Media.Color defaultCoveragePartiallyTouchedArea = System.Windows.Media.Color.FromRgb(255, 165, 0);
22+
private Guid categoryWithCoverage = Guid.Parse("ff349800-ea43-46c1-8c98-878e78f46501");
23+
private bool coverageColoursFromFontsAndColours;
24+
private bool dirty = true;
25+
private bool canUseFontsAndColours = true;
2226
public System.Windows.Media.Color CoverageTouchedArea { get; set; }
2327

2428
public System.Windows.Media.Color CoverageNotTouchedArea { get; set; }
2529

2630
public System.Windows.Media.Color CoveragePartiallyTouchedArea { get; set; }
2731

28-
private bool coverageColoursFromFontsAndColours;
29-
private bool dirty = true;
32+
3033

3134
[ImportingConstructor]
32-
public CoverageColorProvider([Import(typeof(SVsServiceProvider))] IServiceProvider serviceProvider, IAppOptionsProvider appOptionsProvider)
35+
public CoverageColorProvider(
36+
[Import(typeof(SVsServiceProvider))] IServiceProvider serviceProvider,
37+
IAppOptionsProvider appOptionsProvider,
38+
ILogger logger
39+
)
3340
{
3441
ThreadHelper.ThrowIfNotOnUIThread();
3542
fontAndColorStorage = (IVsFontAndColorStorage)serviceProvider.GetService(typeof(IVsFontAndColorStorage));
3643
Assumes.Present(fontAndColorStorage);
3744
coverageColoursFromFontsAndColours = appOptionsProvider.Get().CoverageColoursFromFontsAndColours;
3845
UseDefaultColoursIfNotFontsAndColours();
3946
appOptionsProvider.OptionsChanged += AppOptionsProvider_OptionsChanged;
47+
this.logger = logger;
4048
}
4149

4250
private void AppOptionsProvider_OptionsChanged(IAppOptions appOptions)
@@ -50,15 +58,20 @@ private void UseDefaultColoursIfNotFontsAndColours()
5058
{
5159
if (!coverageColoursFromFontsAndColours)
5260
{
53-
CoverageTouchedArea = defaultCoverageTouchedArea;
54-
CoverageNotTouchedArea = defaultCoverageNotTouchedArea;
55-
CoveragePartiallyTouchedArea = defaultCoveragePartiallyTouchedArea;
61+
UseDefaultColours();
5662
}
5763
}
5864

65+
private void UseDefaultColours()
66+
{
67+
CoverageTouchedArea = defaultCoverageTouchedArea;
68+
CoverageNotTouchedArea = defaultCoverageNotTouchedArea;
69+
CoveragePartiallyTouchedArea = defaultCoveragePartiallyTouchedArea;
70+
}
71+
5972
public async Task PrepareAsync()
6073
{
61-
if (coverageColoursFromFontsAndColours && dirty)
74+
if (coverageColoursFromFontsAndColours && canUseFontsAndColours && dirty)
6275
{
6376
await UpdateColoursFromFontsAndColorsAsync();
6477
}
@@ -69,6 +82,7 @@ private async Task UpdateColoursFromFontsAndColorsAsync()
6982
{
7083
await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
7184
var success = fontAndColorStorage.OpenCategory(ref categoryWithCoverage, storeFlags);
85+
var usedFontsAndColors = false;
7286
if (success == VSConstants.S_OK)
7387
{
7488
// https://github.com/microsoft/vs-threading/issues/993
@@ -80,18 +94,29 @@ System.Windows.Media.Color GetColor(string displayName)
8094
{
8195
return ParseColor(touchAreaInfo[0].crBackground);
8296
}
83-
throw new Exception("Failed to get color");
97+
throw new NotSupportedException($"{getItemSuccess}");
98+
}
99+
try
100+
{
101+
// https://developercommunity.visualstudio.com/t/fonts-and-colors-coverage-settings-available-in-vs/1683898
102+
CoverageTouchedArea = GetColor("Coverage Touched Area");
103+
CoverageNotTouchedArea = GetColor("Coverage Not Touched Area");
104+
CoveragePartiallyTouchedArea = GetColor("Coverage Partially Touched Area");
105+
usedFontsAndColors = true;
106+
107+
}catch(NotSupportedException)
108+
{
109+
logger.Log("No coverage settings available from Fonts and Colors");
84110
}
85-
86-
CoverageTouchedArea = GetColor("Coverage Touched Area");
87-
CoverageNotTouchedArea = GetColor("Coverage Not Touched Area");
88-
CoveragePartiallyTouchedArea = GetColor("Coverage Partially Touched Area");
89111
}
90-
else
112+
113+
fontAndColorStorage.CloseCategory();
114+
if (!usedFontsAndColors)
91115
{
92-
//throw ?
116+
canUseFontsAndColours = false;
117+
UseDefaultColours();
93118
}
94-
fontAndColorStorage.CloseCategory(); // only for success ?
119+
95120
}
96121

97122
private System.Windows.Media.Color ParseColor(uint color)

0 commit comments

Comments
 (0)