1
1
using System ;
2
2
using CodeNav . Helpers ;
3
- using EnvDTE ;
4
- using Microsoft . VisualStudio . LanguageServices ;
5
3
using Microsoft . VisualStudio . Text . Editor ;
6
4
using Microsoft . VisualStudio . Text . Outlining ;
7
- using Microsoft . VisualStudio . TextManager . Interop ;
8
- using DefGuidList = Microsoft . VisualStudio . Editor . DefGuidList ;
9
- using AsyncTask = System . Threading . Tasks . Task ;
10
5
using System . Linq ;
11
6
using System . Runtime . InteropServices ;
12
7
using Community . VisualStudio . Toolkit ;
13
8
using Microsoft . VisualStudio . Shell ;
14
- using WindowEvents = Community . VisualStudio . Toolkit . WindowEvents ;
15
- using DocumentEvents = Community . VisualStudio . Toolkit . DocumentEvents ;
9
+ using Microsoft . VisualStudio . Imaging ;
10
+ using System . Threading . Tasks ;
11
+ using System . Windows ;
12
+ using System . Threading ;
13
+ using Task = System . Threading . Tasks . Task ;
16
14
17
15
namespace CodeNav . ToolWindow
18
16
{
19
- [ Guid ( "88d7674e-67d3-4835-9e0e-aa893dfc985a" ) ]
20
- public class CodeNavToolWindow : ToolWindowPane
17
+ public class CodeNavToolWindow : BaseToolWindow < CodeNavToolWindow >
21
18
{
22
- private readonly CodeViewUserControl _control ;
23
- private WindowEvents _windowEvents ;
24
- private DocumentEvents _documentEvents ;
25
- private VisualStudioWorkspace _workspace ;
26
-
27
- /// <summary>
28
- /// Initializes a new instance of the <see cref="CodeNavToolWindow"/> class.
29
- /// </summary>
30
- public CodeNavToolWindow ( ) : base ( null )
31
- {
32
- Caption = "CodeNav" ;
33
- _control = new CodeViewUserControl ( null ) ;
34
- Content = _control ;
35
- }
19
+ private CodeViewUserControl _control ;
36
20
37
- public override void OnToolWindowCreated ( )
38
- {
39
- var codeNavToolWindowPackage = Package as CodeNavToolWindowPackage ;
40
- _workspace = codeNavToolWindowPackage . ComponentModel . GetService < VisualStudioWorkspace > ( ) ;
21
+ public override string GetTitle ( int toolWindowId ) => "CodeNav" ;
41
22
23
+ public override Type PaneType => typeof ( Pane ) ;
24
+
25
+ public override async Task < FrameworkElement > CreateAsync ( int toolWindowId , CancellationToken cancellationToken )
26
+ {
42
27
RegisterEvents ( ) ;
43
28
44
- _control . ShowWaitingForDocument ( ) ;
29
+ await Package . JoinableTaskFactory . SwitchToMainThreadAsync ( ) ;
30
+
31
+ _control = new CodeViewUserControl ( ) ;
32
+
33
+ _control . CodeDocumentViewModel . CodeDocument = PlaceholderHelper . CreateSelectDocumentItem ( ) ;
34
+
35
+ return _control ;
45
36
}
46
37
47
- private void RegisterEvents ( )
38
+ [ Guid ( "88d7674e-67d3-4835-9e0e-aa893dfc985a" ) ]
39
+ public class Pane : ToolWindowPane
48
40
{
49
- _documentEvents = VS . Events . DocumentEvents ;
50
- _documentEvents . Saved += DocumentEvents_Saved ;
51
- _documentEvents . Opened += DocumentEvents_Opened ;
52
-
53
- _windowEvents = VS . Events . WindowEvents ;
54
- _windowEvents . FrameIsVisibleChanged += WindowEvents_FrameIsVisibleChanged ;
41
+ public Pane ( )
42
+ {
43
+ BitmapImageMoniker = KnownMonikers . DocumentOutline ;
44
+ }
55
45
}
56
46
57
- private void WindowEvents_FrameIsVisibleChanged ( FrameVisibilityEventArgs obj )
58
- => WindowEvents_WindowActivated ( ) ;
47
+ private void RegisterEvents ( )
48
+ {
49
+ VS . Events . DocumentEvents . Saved += DocumentEvents_Saved ;
50
+ VS . Events . DocumentEvents . Opened += DocumentEvents_Opened ;
51
+ VS . Events . WindowEvents . ActiveFrameChanged += WindowEvents_ActiveFrameChanged ;
52
+ }
59
53
54
+ private void WindowEvents_ActiveFrameChanged ( ActiveFrameChangeEventArgs obj )
55
+ => _ = WindowEvents_WindowActivated ( obj ) ;
60
56
61
57
private void DocumentEvents_Opened ( object sender , string e )
62
58
=> UpdateDocument ( ) ;
@@ -70,34 +66,50 @@ private void OutliningManager_RegionsCollapsed(object sender, RegionsCollapsedEv
70
66
private void OutliningManager_RegionsExpanded ( object sender , RegionsExpandedEventArgs e )
71
67
=> _control . RegionsExpanded ( e ) ;
72
68
73
- private void WindowEvents_WindowActivated ( )
69
+ private async Task WindowEvents_WindowActivated ( ActiveFrameChangeEventArgs obj )
74
70
{
75
- // Wire up reference for Caret events
76
- var textViewHost = GetCurrentViewHost ( ) ;
77
- if ( textViewHost != null )
71
+ if ( obj . OldFrame == obj . NewFrame )
72
+ {
73
+ return ;
74
+ }
75
+
76
+ var documentView = await obj . NewFrame . GetDocumentViewAsync ( ) ;
77
+
78
+ var filePath = documentView ? . Document ? . FilePath ;
79
+
80
+ if ( string . IsNullOrEmpty ( filePath ) )
78
81
{
79
- textViewHost . TextView . Caret . PositionChanged += Caret_PositionChanged ;
80
-
81
- if ( Properties . Settings . Default . ShowHistoryIndicators )
82
- {
83
- textViewHost . TextView . TextBuffer . ChangedLowPriority += TextBuffer_ChangedLowPriority ;
84
- }
85
-
86
- // Subscribe to Outlining events
87
- var outliningManagerService = OutliningHelper . GetOutliningManagerService ( Package as IServiceProvider ) ;
88
- var outliningManager = OutliningHelper . GetOutliningManager ( outliningManagerService , GetCurrentViewHost ( ) . TextView ) ;
89
-
90
- if ( outliningManager != null && outliningManagerService != null )
91
- {
92
- _control . OutliningManagerService = outliningManagerService ;
93
- outliningManager . RegionsExpanded -= OutliningManager_RegionsExpanded ;
94
- outliningManager . RegionsExpanded += OutliningManager_RegionsExpanded ;
95
- outliningManager . RegionsCollapsed -= OutliningManager_RegionsCollapsed ;
96
- outliningManager . RegionsCollapsed += OutliningManager_RegionsCollapsed ;
97
- }
82
+ return ;
98
83
}
99
84
100
- UpdateDocument ( ) ;
85
+ var textView = documentView ? . TextView ;
86
+
87
+ if ( textView == null )
88
+ {
89
+ return ;
90
+ }
91
+
92
+ textView . Caret . PositionChanged += Caret_PositionChanged ;
93
+
94
+ if ( Properties . Settings . Default . ShowHistoryIndicators )
95
+ {
96
+ textView . TextBuffer . ChangedLowPriority += TextBuffer_ChangedLowPriority ;
97
+ }
98
+
99
+ // Subscribe to Outlining events
100
+ var outliningManagerService = OutliningHelper . GetOutliningManagerService ( Package ) ;
101
+ var outliningManager = OutliningHelper . GetOutliningManager ( outliningManagerService , textView ) ;
102
+
103
+ if ( outliningManager != null && outliningManagerService != null )
104
+ {
105
+ _control . OutliningManagerService = outliningManagerService ;
106
+ outliningManager . RegionsExpanded -= OutliningManager_RegionsExpanded ;
107
+ outliningManager . RegionsExpanded += OutliningManager_RegionsExpanded ;
108
+ outliningManager . RegionsCollapsed -= OutliningManager_RegionsCollapsed ;
109
+ outliningManager . RegionsCollapsed += OutliningManager_RegionsCollapsed ;
110
+ }
111
+
112
+ UpdateDocument ( filePath ) ;
101
113
}
102
114
103
115
private void TextBuffer_ChangedLowPriority ( object sender , Microsoft . VisualStudio . Text . TextContentChangedEventArgs e )
@@ -112,39 +124,16 @@ private void TextBuffer_ChangedLowPriority(object sender, Microsoft.VisualStudio
112
124
113
125
private void Caret_PositionChanged ( object sender , CaretPositionChangedEventArgs e ) => _control . HighlightCurrentItem ( ) ;
114
126
115
- private void UpdateDocument ( bool forceUpdate = false )
127
+ private void UpdateDocument ( string filePath = "" , bool forceUpdate = false )
116
128
{
117
129
try
118
130
{
119
- _control . SetWorkspace ( _workspace ) ;
120
- _ = _control . UpdateDocument ( forceUpdate : forceUpdate ) ;
131
+ _ = _control . UpdateDocument ( filePath , forceUpdate ) ;
121
132
}
122
133
catch ( Exception e )
123
134
{
124
135
LogHelper . Log ( "Error updating document in ToolWindow" , e ) ;
125
136
}
126
137
}
127
-
128
- private IWpfTextViewHost GetCurrentViewHost ( )
129
- {
130
- // code to get access to the editor's currently selected text cribbed from
131
- // http://msdn.microsoft.com/en-us/library/dd884850.aspx
132
-
133
- var txtMgr = ( IVsTextManager ) GetService ( typeof ( SVsTextManager ) ) ;
134
- var mustHaveFocus = 1 ;
135
- txtMgr . GetActiveView ( mustHaveFocus , null , out IVsTextView vTextView ) ;
136
-
137
- if ( ! ( vTextView is IVsUserData userData ) )
138
- {
139
- return null ;
140
- }
141
-
142
- IWpfTextViewHost viewHost ;
143
- Guid guidViewHost = DefGuidList . guidIWpfTextViewHost ;
144
- userData . GetData ( ref guidViewHost , out var holder ) ;
145
- viewHost = ( IWpfTextViewHost ) holder ;
146
-
147
- return viewHost ;
148
- }
149
138
}
150
139
}
0 commit comments