@@ -14,29 +14,37 @@ namespace FineCodeCoverage.Impl
14
14
internal class CoverageColorProvider : ICoverageColoursProvider , ICoverageColours
15
15
{
16
16
private readonly IVsFontAndColorStorage fontAndColorStorage ;
17
- private Guid categoryWithCoverage = Guid . Parse ( "ff349800-ea43-46c1-8c98-878e78f46501" ) ;
17
+ private readonly ILogger logger ;
18
18
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 ;
22
26
public System . Windows . Media . Color CoverageTouchedArea { get ; set ; }
23
27
24
28
public System . Windows . Media . Color CoverageNotTouchedArea { get ; set ; }
25
29
26
30
public System . Windows . Media . Color CoveragePartiallyTouchedArea { get ; set ; }
27
31
28
- private bool coverageColoursFromFontsAndColours ;
29
- private bool dirty = true ;
32
+
30
33
31
34
[ 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
+ )
33
40
{
34
41
ThreadHelper . ThrowIfNotOnUIThread ( ) ;
35
42
fontAndColorStorage = ( IVsFontAndColorStorage ) serviceProvider . GetService ( typeof ( IVsFontAndColorStorage ) ) ;
36
43
Assumes . Present ( fontAndColorStorage ) ;
37
44
coverageColoursFromFontsAndColours = appOptionsProvider . Get ( ) . CoverageColoursFromFontsAndColours ;
38
45
UseDefaultColoursIfNotFontsAndColours ( ) ;
39
46
appOptionsProvider . OptionsChanged += AppOptionsProvider_OptionsChanged ;
47
+ this . logger = logger ;
40
48
}
41
49
42
50
private void AppOptionsProvider_OptionsChanged ( IAppOptions appOptions )
@@ -50,15 +58,20 @@ private void UseDefaultColoursIfNotFontsAndColours()
50
58
{
51
59
if ( ! coverageColoursFromFontsAndColours )
52
60
{
53
- CoverageTouchedArea = defaultCoverageTouchedArea ;
54
- CoverageNotTouchedArea = defaultCoverageNotTouchedArea ;
55
- CoveragePartiallyTouchedArea = defaultCoveragePartiallyTouchedArea ;
61
+ UseDefaultColours ( ) ;
56
62
}
57
63
}
58
64
65
+ private void UseDefaultColours ( )
66
+ {
67
+ CoverageTouchedArea = defaultCoverageTouchedArea ;
68
+ CoverageNotTouchedArea = defaultCoverageNotTouchedArea ;
69
+ CoveragePartiallyTouchedArea = defaultCoveragePartiallyTouchedArea ;
70
+ }
71
+
59
72
public async Task PrepareAsync ( )
60
73
{
61
- if ( coverageColoursFromFontsAndColours && dirty )
74
+ if ( coverageColoursFromFontsAndColours && canUseFontsAndColours && dirty )
62
75
{
63
76
await UpdateColoursFromFontsAndColorsAsync ( ) ;
64
77
}
@@ -69,6 +82,7 @@ private async Task UpdateColoursFromFontsAndColorsAsync()
69
82
{
70
83
await ThreadHelper . JoinableTaskFactory . SwitchToMainThreadAsync ( ) ;
71
84
var success = fontAndColorStorage . OpenCategory ( ref categoryWithCoverage , storeFlags ) ;
85
+ var usedFontsAndColors = false ;
72
86
if ( success == VSConstants . S_OK )
73
87
{
74
88
// https://github.com/microsoft/vs-threading/issues/993
@@ -80,18 +94,29 @@ System.Windows.Media.Color GetColor(string displayName)
80
94
{
81
95
return ParseColor ( touchAreaInfo [ 0 ] . crBackground ) ;
82
96
}
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" ) ;
84
110
}
85
-
86
- CoverageTouchedArea = GetColor ( "Coverage Touched Area" ) ;
87
- CoverageNotTouchedArea = GetColor ( "Coverage Not Touched Area" ) ;
88
- CoveragePartiallyTouchedArea = GetColor ( "Coverage Partially Touched Area" ) ;
89
111
}
90
- else
112
+
113
+ fontAndColorStorage . CloseCategory ( ) ;
114
+ if ( ! usedFontsAndColors )
91
115
{
92
- //throw ?
116
+ canUseFontsAndColours = false ;
117
+ UseDefaultColours ( ) ;
93
118
}
94
- fontAndColorStorage . CloseCategory ( ) ; // only for success ?
119
+
95
120
}
96
121
97
122
private System . Windows . Media . Color ParseColor ( uint color )
0 commit comments