@@ -2166,4 +2166,153 @@ private bool IsWellKnownPane(Guid paneGuid)
21662166 paneGuid == VSConstants . OutputWindowPaneGuid . DebugPane_guid ||
21672167 paneGuid == VSConstants . OutputWindowPaneGuid . GeneralPane_guid ;
21682168 }
2169+
2170+ private static readonly Dictionary < string , string > ToolWindowCommands = new ( StringComparer . OrdinalIgnoreCase )
2171+ {
2172+ [ "SolutionExplorer" ] = "View.SolutionExplorer" ,
2173+ [ "ErrorList" ] = "View.ErrorList" ,
2174+ [ "Output" ] = "View.Output" ,
2175+ [ "TeamExplorer" ] = "View.TeamExplorer" ,
2176+ [ "Terminal" ] = "View.Terminal" ,
2177+ [ "TaskList" ] = "View.TaskList" ,
2178+ [ "Properties" ] = "View.PropertiesWindow" ,
2179+ [ "Toolbox" ] = "View.Toolbox" ,
2180+ [ "FindResults" ] = "View.FindResults1" ,
2181+ [ "Bookmarks" ] = "View.BookmarkWindow" ,
2182+ } ;
2183+
2184+ public async Task < List < Shared . Models . WindowInfo > > GetWindowsAsync ( )
2185+ {
2186+ using var activity = VsixTelemetry . Tracer . StartActivity ( "GetWindows" ) ;
2187+ await ThreadHelper . JoinableTaskFactory . SwitchToMainThreadAsync ( ) ;
2188+ var dte = await GetDteAsync ( ) ;
2189+
2190+ try
2191+ {
2192+ var windows = new List < Shared . Models . WindowInfo > ( ) ;
2193+
2194+ foreach ( Window window in dte . Windows )
2195+ {
2196+ try
2197+ {
2198+ windows . Add ( new Shared . Models . WindowInfo
2199+ {
2200+ Caption = window . Caption ,
2201+ Kind = window . Document != null ? "Document" : "Tool" ,
2202+ IsVisible = window . Visible ,
2203+ ObjectKind = window . ObjectKind ?? string . Empty ,
2204+ } ) ;
2205+ }
2206+ catch ( Exception )
2207+ {
2208+ // Some windows may not be accessible
2209+ }
2210+ }
2211+
2212+ return windows ;
2213+ }
2214+ catch ( Exception ex )
2215+ {
2216+ activity ? . SetStatus ( ActivityStatusCode . Error , ex . Message ) ;
2217+ activity ? . RecordException ( ex ) ;
2218+ return new List < Shared . Models . WindowInfo > ( ) ;
2219+ }
2220+ }
2221+
2222+ public async Task < bool > ActivateWindowAsync ( string caption )
2223+ {
2224+ using var activity = VsixTelemetry . Tracer . StartActivity ( "ActivateWindow" ) ;
2225+ await ThreadHelper . JoinableTaskFactory . SwitchToMainThreadAsync ( ) ;
2226+ var dte = await GetDteAsync ( ) ;
2227+
2228+ try
2229+ {
2230+ foreach ( Window window in dte . Windows )
2231+ {
2232+ try
2233+ {
2234+ if ( string . Equals ( window . Caption , caption , StringComparison . OrdinalIgnoreCase ) )
2235+ {
2236+ window . Activate ( ) ;
2237+ return true ;
2238+ }
2239+ }
2240+ catch ( Exception )
2241+ {
2242+ // Some windows may not be accessible
2243+ }
2244+ }
2245+
2246+ return false ;
2247+ }
2248+ catch ( Exception ex )
2249+ {
2250+ activity ? . SetStatus ( ActivityStatusCode . Error , ex . Message ) ;
2251+ activity ? . RecordException ( ex ) ;
2252+ return false ;
2253+ }
2254+ }
2255+
2256+ public async Task < bool > ShowToolWindowAsync ( string name )
2257+ {
2258+ using var activity = VsixTelemetry . Tracer . StartActivity ( "ShowToolWindow" ) ;
2259+ await ThreadHelper . JoinableTaskFactory . SwitchToMainThreadAsync ( ) ;
2260+ var dte = await GetDteAsync ( ) ;
2261+
2262+ try
2263+ {
2264+ if ( ! ToolWindowCommands . TryGetValue ( name , out var command ) )
2265+ {
2266+ return false ;
2267+ }
2268+
2269+ dte . ExecuteCommand ( command ) ;
2270+ return true ;
2271+ }
2272+ catch ( Exception ex )
2273+ {
2274+ activity ? . SetStatus ( ActivityStatusCode . Error , ex . Message ) ;
2275+ activity ? . RecordException ( ex ) ;
2276+ return false ;
2277+ }
2278+ }
2279+
2280+ public async Task < bool > HideToolWindowAsync ( string caption )
2281+ {
2282+ using var activity = VsixTelemetry . Tracer . StartActivity ( "HideToolWindow" ) ;
2283+ await ThreadHelper . JoinableTaskFactory . SwitchToMainThreadAsync ( ) ;
2284+ var dte = await GetDteAsync ( ) ;
2285+
2286+ try
2287+ {
2288+ foreach ( Window window in dte . Windows )
2289+ {
2290+ try
2291+ {
2292+ if ( string . Equals ( window . Caption , caption , StringComparison . OrdinalIgnoreCase ) )
2293+ {
2294+ window . Close ( ) ;
2295+ return true ;
2296+ }
2297+ }
2298+ catch ( Exception )
2299+ {
2300+ // Some windows may not be accessible
2301+ }
2302+ }
2303+
2304+ return false ;
2305+ }
2306+ catch ( Exception ex )
2307+ {
2308+ activity ? . SetStatus ( ActivityStatusCode . Error , ex . Message ) ;
2309+ activity ? . RecordException ( ex ) ;
2310+ return false ;
2311+ }
2312+ }
2313+
2314+ public static IReadOnlyCollection < string > GetSupportedToolWindowNames ( )
2315+ {
2316+ return ToolWindowCommands . Keys ;
2317+ }
21692318}
0 commit comments