@@ -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