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