55using Microsoft . VisualStudio ;
66using Microsoft . VisualStudio . Shell ;
77using Microsoft . VisualStudio . Shell . Interop ;
8+ using Task = System . Threading . Tasks . Task ;
89
910namespace FineCodeCoverage . Impl
1011{
@@ -14,51 +15,18 @@ internal class CoverageColorProvider : ICoverageColoursProvider, ICoverageColour
1415 {
1516 private readonly IVsFontAndColorStorage fontAndColorStorage ;
1617 private Guid categoryWithCoverage = Guid . Parse ( "ff349800-ea43-46c1-8c98-878e78f46501" ) ;
17- private uint storeFlags = ( uint ) ( __FCSTORAGEFLAGS . FCSF_READONLY | __FCSTORAGEFLAGS . FCSF_LOADDEFAULTS | __FCSTORAGEFLAGS . FCSF_NOAUTOCOLORS | __FCSTORAGEFLAGS . FCSF_PROPAGATECHANGES ) ;
18+ private readonly uint storeFlags = ( uint ) ( __FCSTORAGEFLAGS . FCSF_READONLY | __FCSTORAGEFLAGS . FCSF_LOADDEFAULTS | __FCSTORAGEFLAGS . FCSF_NOAUTOCOLORS | __FCSTORAGEFLAGS . FCSF_PROPAGATECHANGES ) ;
1819 private System . Windows . Media . Color defaultCoverageTouchedArea = System . Windows . Media . Colors . Green ;
1920 private System . Windows . Media . Color defaultCoverageNotTouchedArea = System . Windows . Media . Colors . Red ;
2021 private System . Windows . Media . Color defaultCoveragePartiallyTouchedArea = System . Windows . Media . Color . FromRgb ( 255 , 165 , 0 ) ;
21- private System . Windows . Media . Color coverageTouchedArea ;
22- private System . Windows . Media . Color coverageNotTouchedArea ;
23- private System . Windows . Media . Color coveragePartiallyTouchedArea ;
24- public System . Windows . Media . Color CoverageTouchedArea {
25- get {
26- UpdateFromFontsAndColorsIfNecessary ( ) ;
27- return coverageTouchedArea ;
28- }
29- private set
30- {
31- coverageTouchedArea = value ;
32- }
33- }
22+ public System . Windows . Media . Color CoverageTouchedArea { get ; set ; }
3423
35- public System . Windows . Media . Color CoverageNotTouchedArea {
36- get
37- {
38- UpdateFromFontsAndColorsIfNecessary ( ) ;
39- return coverageNotTouchedArea ;
40- }
41- private set
42- {
43- coverageNotTouchedArea = value ;
44- }
45- }
24+ public System . Windows . Media . Color CoverageNotTouchedArea { get ; set ; }
4625
47- public System . Windows . Media . Color CoveragePartiallyTouchedArea {
48- get
49- {
50- UpdateFromFontsAndColorsIfNecessary ( ) ;
51- return coveragePartiallyTouchedArea ;
52- }
53- private set
54- {
55- coveragePartiallyTouchedArea = value ;
56- }
57-
58- }
26+ public System . Windows . Media . Color CoveragePartiallyTouchedArea { get ; set ; }
5927
6028 private bool coverageColoursFromFontsAndColours ;
61- private bool requiresFromFontsAndColours ;
29+ private bool dirty = true ;
6230
6331 [ ImportingConstructor ]
6432 public CoverageColorProvider ( [ Import ( typeof ( SVsServiceProvider ) ) ] IServiceProvider serviceProvider , IAppOptionsProvider appOptionsProvider )
@@ -75,6 +43,7 @@ private void AppOptionsProvider_OptionsChanged(IAppOptions appOptions)
7543 {
7644 coverageColoursFromFontsAndColours = appOptions . CoverageColoursFromFontsAndColours ;
7745 UseDefaultColoursIfNotFontsAndColours ( ) ;
46+ dirty = true ;
7847 }
7948
8049 private void UseDefaultColoursIfNotFontsAndColours ( )
@@ -87,48 +56,42 @@ private void UseDefaultColoursIfNotFontsAndColours()
8756 }
8857 }
8958
90- public void UpdateRequired ( )
91- {
92- requiresFromFontsAndColours = true ;
93- }
94-
95- private void UpdateFromFontsAndColorsIfNecessary ( )
59+ public async Task PrepareAsync ( )
9660 {
97- if ( coverageColoursFromFontsAndColours && requiresFromFontsAndColours )
61+ if ( coverageColoursFromFontsAndColours && dirty )
9862 {
99- UpdateColoursFromFontsAndColors ( ) ;
63+ await UpdateColoursFromFontsAndColorsAsync ( ) ;
10064 }
65+ dirty = false ;
10166 }
10267
103- private void UpdateColoursFromFontsAndColors ( )
68+ private async Task UpdateColoursFromFontsAndColorsAsync ( )
10469 {
105- ThreadHelper . JoinableTaskFactory . Run ( async ( ) =>
70+ await ThreadHelper . JoinableTaskFactory . SwitchToMainThreadAsync ( ) ;
71+ var success = fontAndColorStorage . OpenCategory ( ref categoryWithCoverage , storeFlags ) ;
72+ if ( success == VSConstants . S_OK )
10673 {
107- await ThreadHelper . JoinableTaskFactory . SwitchToMainThreadAsync ( ) ;
108- var success = fontAndColorStorage . OpenCategory ( ref categoryWithCoverage , storeFlags ) ;
109- if ( success == VSConstants . S_OK )
74+ // https://github.com/microsoft/vs-threading/issues/993
75+ System . Windows . Media . Color GetColor ( string displayName )
11076 {
111- // https://github.com/microsoft/vs-threading/issues/993
112- System . Windows . Media . Color GetColor ( string displayName )
77+ var touchAreaInfo = new ColorableItemInfo [ 1 ] ;
78+ var getItemSuccess = fontAndColorStorage . GetItem ( displayName , touchAreaInfo ) ;
79+ if ( getItemSuccess == VSConstants . S_OK )
11380 {
114- var touchAreaInfo = new ColorableItemInfo [ 1 ] ;
115- var getItemSuccess = fontAndColorStorage . GetItem ( displayName , touchAreaInfo ) ;
116- if ( getItemSuccess == VSConstants . S_OK )
117- {
118- return ParseColor ( touchAreaInfo [ 0 ] . crBackground ) ;
119- }
120- throw new Exception ( "Failed to get color" ) ;
81+ return ParseColor ( touchAreaInfo [ 0 ] . crBackground ) ;
12182 }
122-
123- CoverageTouchedArea = GetColor ( "Coverage Touched Area" ) ;
124- CoverageNotTouchedArea = GetColor ( "Coverage Not Touched Area" ) ;
125- CoveragePartiallyTouchedArea = GetColor ( "Coverage Partially Touched Area" ) ;
83+ throw new Exception ( "Failed to get color" ) ;
12684 }
127- fontAndColorStorage . CloseCategory ( ) ;
85+
86+ CoverageTouchedArea = GetColor ( "Coverage Touched Area" ) ;
87+ CoverageNotTouchedArea = GetColor ( "Coverage Not Touched Area" ) ;
88+ CoveragePartiallyTouchedArea = GetColor ( "Coverage Partially Touched Area" ) ;
89+ }
90+ else
91+ {
12892 //throw ?
129- requiresFromFontsAndColours = false ;
130- } ) ;
131-
93+ }
94+ fontAndColorStorage . CloseCategory ( ) ; // only for success ?
13295 }
13396
13497 private System . Windows . Media . Color ParseColor ( uint color )
0 commit comments