Skip to content
This repository was archived by the owner on Jun 21, 2023. It is now read-only.

Commit c735ae0

Browse files
committed
Move service provider and vs extensions to separate classes
1 parent 875baef commit c735ae0

File tree

3 files changed

+124
-116
lines changed

3 files changed

+124
-116
lines changed
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
using System;
2+
using System.ComponentModel.Design;
3+
using System.Diagnostics;
4+
using GitHub.Primitives;
5+
using GitHub.Services;
6+
using LibGit2Sharp;
7+
using Microsoft.TeamFoundation.Controls;
8+
using Microsoft.VisualStudio;
9+
using Microsoft.VisualStudio.Shell;
10+
using Microsoft.VisualStudio.Shell.Interop;
11+
12+
namespace GitHub.Extensions
13+
{
14+
public static class IServiceProviderExtensions
15+
{
16+
static IUIProvider cachedUIProvider = null;
17+
18+
public static T TryGetService<T>(this IServiceProvider serviceProvider) where T : class
19+
{
20+
return serviceProvider.TryGetService(typeof(T)) as T;
21+
}
22+
23+
public static object TryGetService(this IServiceProvider serviceProvider, Type type)
24+
{
25+
if (cachedUIProvider != null && type == typeof(IUIProvider))
26+
return cachedUIProvider;
27+
28+
var ui = serviceProvider as IUIProvider;
29+
if (ui != null)
30+
return ui.TryGetService(type);
31+
else
32+
{
33+
try
34+
{
35+
return GetServiceAndCache(serviceProvider, type, ref cachedUIProvider);
36+
}
37+
catch (Exception ex)
38+
{
39+
Debug.Print(ex.ToString());
40+
}
41+
return null;
42+
}
43+
}
44+
45+
public static T GetService<T>(this IServiceProvider serviceProvider)
46+
{
47+
if (cachedUIProvider != null && typeof(T) == typeof(IUIProvider))
48+
return (T)cachedUIProvider;
49+
50+
return (T)GetServiceAndCache(serviceProvider, typeof(T), ref cachedUIProvider);
51+
}
52+
53+
public static T GetExportedValue<T>(this IServiceProvider serviceProvider)
54+
{
55+
if (cachedUIProvider != null && typeof(T) == typeof(IUIProvider))
56+
return (T)cachedUIProvider;
57+
58+
var ui = serviceProvider as IUIProvider;
59+
return ui != null
60+
? ui.GetService<T>()
61+
: GetExportedValueAndCache<T, IUIProvider>(ref cachedUIProvider);
62+
}
63+
64+
public static ITeamExplorerSection GetSection(this IServiceProvider serviceProvider, Guid section)
65+
{
66+
return serviceProvider?.GetService<ITeamExplorerPage>()?.GetSection(section);
67+
}
68+
69+
static object GetServiceAndCache<CacheType>(IServiceProvider provider, Type type, ref CacheType cache)
70+
{
71+
var ret = provider.GetService(type);
72+
if (type == typeof(CacheType))
73+
cache = (CacheType)ret;
74+
return ret;
75+
}
76+
77+
static T GetExportedValueAndCache<T, CacheType>(ref CacheType cache)
78+
{
79+
var ret = VisualStudio.Services.ComponentModel.DefaultExportProvider.GetExportedValue<T>();
80+
if (typeof(T) == typeof(CacheType))
81+
cache = (CacheType)(object)ret;
82+
return ret;
83+
}
84+
85+
public static void AddTopLevelMenuItem(this IServiceProvider provider,
86+
Guid guid,
87+
int cmdId,
88+
EventHandler eventHandler)
89+
{
90+
var mcs = provider.GetService(typeof(IMenuCommandService)) as IMenuCommandService;
91+
Debug.Assert(mcs != null, "No IMenuCommandService? Something is wonky");
92+
if (mcs == null)
93+
return;
94+
var id = new CommandID(guid, cmdId);
95+
var item = new MenuCommand(eventHandler, id);
96+
mcs.AddCommand(item);
97+
}
98+
99+
public static void AddDynamicMenuItem(this IServiceProvider provider,
100+
Guid guid,
101+
int cmdId,
102+
Func<bool> canEnable,
103+
Action execute)
104+
{
105+
var mcs = provider.GetService(typeof(IMenuCommandService)) as IMenuCommandService;
106+
Debug.Assert(mcs != null, "No IMenuCommandService? Something is wonky");
107+
if (mcs == null)
108+
return;
109+
var id = new CommandID(guid, cmdId);
110+
var item = new OleMenuCommand(
111+
(s, e) => execute(),
112+
(s, e) => { },
113+
(s, e) =>
114+
{
115+
((OleMenuCommand)s).Visible = canEnable();
116+
},
117+
id);
118+
mcs.AddCommand(item);
119+
}
120+
}
121+
}

src/GitHub.Exports/Extensions/VSExtensions.cs

Lines changed: 1 addition & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -1,124 +1,10 @@
1-
using System;
2-
using System.ComponentModel.Design;
3-
using System.Diagnostics;
4-
using GitHub.Primitives;
5-
using GitHub.Services;
1+
using GitHub.Services;
62
using LibGit2Sharp;
7-
using Microsoft.TeamFoundation.Controls;
83
using Microsoft.VisualStudio;
9-
using Microsoft.VisualStudio.Shell;
104
using Microsoft.VisualStudio.Shell.Interop;
115

126
namespace GitHub.Extensions
137
{
14-
public static class IServiceProviderExtensions
15-
{
16-
static IUIProvider cachedUIProvider = null;
17-
18-
public static T TryGetService<T>(this IServiceProvider serviceProvider) where T : class
19-
{
20-
return serviceProvider.TryGetService(typeof(T)) as T;
21-
}
22-
23-
public static object TryGetService(this IServiceProvider serviceProvider, Type type)
24-
{
25-
if (cachedUIProvider != null && type == typeof(IUIProvider))
26-
return cachedUIProvider;
27-
28-
var ui = serviceProvider as IUIProvider;
29-
if (ui != null)
30-
return ui.TryGetService(type);
31-
else
32-
{
33-
try
34-
{
35-
return GetServiceAndCache(serviceProvider, type, ref cachedUIProvider);
36-
}
37-
catch (Exception ex)
38-
{
39-
Debug.Print(ex.ToString());
40-
}
41-
return null;
42-
}
43-
}
44-
45-
public static T GetService<T>(this IServiceProvider serviceProvider)
46-
{
47-
if (cachedUIProvider != null && typeof(T) == typeof(IUIProvider))
48-
return (T)cachedUIProvider;
49-
50-
return (T)GetServiceAndCache(serviceProvider, typeof(T), ref cachedUIProvider);
51-
}
52-
53-
public static T GetExportedValue<T>(this IServiceProvider serviceProvider)
54-
{
55-
if (cachedUIProvider != null && typeof(T) == typeof(IUIProvider))
56-
return (T)cachedUIProvider;
57-
58-
var ui = serviceProvider as IUIProvider;
59-
return ui != null
60-
? ui.GetService<T>()
61-
: GetExportedValueAndCache<T, IUIProvider>(ref cachedUIProvider);
62-
}
63-
64-
public static ITeamExplorerSection GetSection(this IServiceProvider serviceProvider, Guid section)
65-
{
66-
return serviceProvider?.GetService<ITeamExplorerPage>()?.GetSection(section);
67-
}
68-
69-
static object GetServiceAndCache<CacheType>(IServiceProvider provider, Type type, ref CacheType cache)
70-
{
71-
var ret = provider.GetService(type);
72-
if (type == typeof(CacheType))
73-
cache = (CacheType)ret;
74-
return ret;
75-
}
76-
77-
static T GetExportedValueAndCache<T, CacheType>(ref CacheType cache)
78-
{
79-
var ret = VisualStudio.Services.ComponentModel.DefaultExportProvider.GetExportedValue<T>();
80-
if (typeof(T) == typeof(CacheType))
81-
cache = (CacheType)(object)ret;
82-
return ret;
83-
}
84-
85-
public static void AddTopLevelMenuItem(this IServiceProvider provider,
86-
Guid guid,
87-
int cmdId,
88-
EventHandler eventHandler)
89-
{
90-
var mcs = provider.GetService(typeof(IMenuCommandService)) as IMenuCommandService;
91-
Debug.Assert(mcs != null, "No IMenuCommandService? Something is wonky");
92-
if (mcs == null)
93-
return;
94-
var id = new CommandID(guid, cmdId);
95-
var item = new MenuCommand(eventHandler, id);
96-
mcs.AddCommand(item);
97-
}
98-
99-
public static void AddDynamicMenuItem(this IServiceProvider provider,
100-
Guid guid,
101-
int cmdId,
102-
Func<bool> canEnable,
103-
Action execute)
104-
{
105-
var mcs = provider.GetService(typeof(IMenuCommandService)) as IMenuCommandService;
106-
Debug.Assert(mcs != null, "No IMenuCommandService? Something is wonky");
107-
if (mcs == null)
108-
return;
109-
var id = new CommandID(guid, cmdId);
110-
var item = new OleMenuCommand(
111-
(s, e) => execute(),
112-
(s, e) => { },
113-
(s, e) =>
114-
{
115-
((OleMenuCommand)s).Visible = canEnable();
116-
},
117-
id);
118-
mcs.AddCommand(item);
119-
}
120-
}
121-
1228
public static class ISolutionExtensions
1239
{
12410
public static IRepository GetRepoFromSolution(this IVsSolution solution)

src/GitHub.Exports/GitHub.Exports.csproj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@
9898
</None>
9999
<Compile Include="Collections\ICopyable.cs" />
100100
<Compile Include="ExceptionExtensions.cs" />
101+
<Compile Include="Extensions\VSExtensions.cs" />
101102
<Compile Include="Helpers\INotifyPropertySource.cs" />
102103
<Compile Include="Extensions\PropertyNotifierExtensions.cs" />
103104
<Compile Include="Extensions\SimpleRepositoryModelExtensions.cs" />
@@ -123,7 +124,7 @@
123124
</ItemGroup>
124125
<ItemGroup>
125126
<Compile Include="Authentication\AuthenticationResultExtensions.cs" />
126-
<Compile Include="Extensions\VSExtensions.cs" />
127+
<Compile Include="Extensions\ServiceProviderExtensions.cs" />
127128
<Compile Include="ViewModels\IServiceProviderAware.cs" />
128129
<Compile Include="UI\IView.cs" />
129130
<Compile Include="UI\Octicon.cs" />

0 commit comments

Comments
 (0)