@ -84,9 +84,9 @@ namespace ICSharpCode.ILSpy
@@ -84,9 +84,9 @@ namespace ICSharpCode.ILSpy
internal AssemblyListManager AssemblyListManager { get ; }
public SharpTreeView t reeView {
public SharpTreeView AssemblyT reeView {
get {
return FindResource ( "TreeView" ) as SharpTreeView ;
return FindResource ( "Assembly TreeView" ) as SharpTreeView ;
}
}
@ -120,13 +120,13 @@ namespace ICSharpCode.ILSpy
@@ -120,13 +120,13 @@ namespace ICSharpCode.ILSpy
DockWorkspace . Instance . LoadSettings ( sessionSettings ) ;
InitializeComponent ( ) ;
InitToolPanes ( ) ;
DockWorkspace . Instance . InitializeLayout ( DockManager ) ;
sessionSettings . FilterSettings . PropertyChanged + = filterSettings_PropertyChanged ;
sessionSettings . PropertyChanged + = SessionSettings_PropertyChanged ;
InitMainMenu ( ) ;
InitToolbar ( ) ;
ContextMenuProvider . Add ( t reeView) ;
ContextMenuProvider . Add ( AssemblyT reeView) ;
this . Loaded + = MainWindow_Loaded ;
}
@ -231,6 +231,48 @@ namespace ICSharpCode.ILSpy
@@ -231,6 +231,48 @@ namespace ICSharpCode.ILSpy
}
#endregion
#region Tool Pane extensibility
private void InitToolPanes ( )
{
var toolPanes = App . ExportProvider . GetExports < ToolPaneModel , IToolPaneMetadata > ( "ToolPane" ) ;
var templateSelector = new PaneTemplateSelector ( ) ;
templateSelector . Mappings . Add ( new TemplateMapping {
Type = typeof ( TabPageModel ) ,
Template = ( DataTemplate ) FindResource ( "DefaultContentTemplate" )
} ) ;
templateSelector . Mappings . Add ( new TemplateMapping {
Type = typeof ( LegacyToolPaneModel ) ,
Template = ( DataTemplate ) FindResource ( "DefaultContentTemplate" )
} ) ;
foreach ( var toolPane in toolPanes ) {
ToolPaneModel model = toolPane . Value ;
templateSelector . Mappings . Add ( new TemplateMapping { Type = model . GetType ( ) , Template = model . Template } ) ;
DockWorkspace . Instance . ToolPanes . Add ( model ) ;
}
DockManager . LayoutItemTemplateSelector = templateSelector ;
}
public void ShowInTopPane ( string title , object content )
{
var model = DockWorkspace . Instance . ToolPanes . OfType < LegacyToolPaneModel > ( ) . FirstOrDefault ( p = > p . Content = = content ) ;
if ( model = = null ) {
model = new LegacyToolPaneModel ( title , content , LegacyToolPaneLocation . Top ) ;
DockWorkspace . Instance . ToolPanes . Add ( model ) ;
}
model . Show ( ) ;
}
public void ShowInBottomPane ( string title , object content )
{
var model = DockWorkspace . Instance . ToolPanes . OfType < LegacyToolPaneModel > ( ) . FirstOrDefault ( p = > p . Content = = content ) ;
if ( model = = null ) {
model = new LegacyToolPaneModel ( title , content , LegacyToolPaneLocation . Bottom ) ;
DockWorkspace . Instance . ToolPanes . Add ( model ) ;
}
model . Show ( ) ;
}
#endregion
#region Message Hook
protected override void OnSourceInitialized ( EventArgs e )
{
@ -337,7 +379,7 @@ namespace ICSharpCode.ILSpy
@@ -337,7 +379,7 @@ namespace ICSharpCode.ILSpy
async void NavigateOnLaunch ( string navigateTo , string [ ] activeTreeViewPath , ILSpySettings spySettings , List < LoadedAssembly > relevantAssemblies )
{
var initialSelection = t reeView. SelectedItem ;
var initialSelection = AssemblyT reeView. SelectedItem ;
if ( navigateTo ! = null ) {
bool found = false ;
if ( navigateTo . StartsWith ( "N:" , StringComparison . Ordinal ) ) {
@ -351,7 +393,7 @@ namespace ICSharpCode.ILSpy
@@ -351,7 +393,7 @@ namespace ICSharpCode.ILSpy
NamespaceTreeNode nsNode = asmNode . FindNamespaceNode ( namespaceName ) ;
if ( nsNode ! = null ) {
found = true ;
if ( t reeView. SelectedItem = = initialSelection ) {
if ( AssemblyT reeView. SelectedItem = = initialSelection ) {
SelectNode ( nsNode ) ;
}
break ;
@ -366,12 +408,12 @@ namespace ICSharpCode.ILSpy
@@ -366,12 +408,12 @@ namespace ICSharpCode.ILSpy
IEntity mr = await Task . Run ( ( ) = > FindEntityInRelevantAssemblies ( navigateTo , relevantAssemblies ) ) ;
if ( mr ! = null & & mr . ParentModule . PEFile ! = null ) {
found = true ;
if ( t reeView. SelectedItem = = initialSelection ) {
if ( AssemblyT reeView. SelectedItem = = initialSelection ) {
JumpToReference ( mr ) ;
}
}
}
if ( ! found & & t reeView. SelectedItem = = initialSelection ) {
if ( ! found & & AssemblyT reeView. SelectedItem = = initialSelection ) {
AvalonEditTextOutput output = new AvalonEditTextOutput ( ) ;
output . Write ( string . Format ( "Cannot find '{0}' in command line specified assemblies." , navigateTo ) ) ;
DockWorkspace . Instance . ShowText ( output ) ;
@ -380,7 +422,7 @@ namespace ICSharpCode.ILSpy
@@ -380,7 +422,7 @@ namespace ICSharpCode.ILSpy
// NavigateTo == null and an assembly was given on the command-line:
// Select the newly loaded assembly
AssemblyTreeNode asmNode = assemblyListTreeNode . FindAssemblyNode ( relevantAssemblies [ 0 ] ) ;
if ( asmNode ! = null & & t reeView. SelectedItem = = initialSelection ) {
if ( asmNode ! = null & & AssemblyT reeView. SelectedItem = = initialSelection ) {
SelectNode ( asmNode ) ;
}
} else if ( spySettings ! = null ) {
@ -395,7 +437,7 @@ namespace ICSharpCode.ILSpy
@@ -395,7 +437,7 @@ namespace ICSharpCode.ILSpy
}
node = FindNodeByPath ( activeTreeViewPath , true ) ;
}
if ( t reeView. SelectedItem = = initialSelection ) {
if ( AssemblyT reeView. SelectedItem = = initialSelection ) {
if ( node ! = null ) {
SelectNode ( node ) ;
@ -598,6 +640,7 @@ namespace ICSharpCode.ILSpy
@@ -598,6 +640,7 @@ namespace ICSharpCode.ILSpy
//Only load a new list when it is a different one
if ( list . ListName ! = CurrentAssemblyList . ListName ) {
ShowAssemblyList ( list ) ;
SelectNode ( AssemblyTreeView . Root ) ;
}
}
@ -611,7 +654,7 @@ namespace ICSharpCode.ILSpy
@@ -611,7 +654,7 @@ namespace ICSharpCode.ILSpy
assemblyListTreeNode = new AssemblyListTreeNode ( assemblyList ) ;
assemblyListTreeNode . FilterSettings = sessionSettings . FilterSettings . Clone ( ) ;
assemblyListTreeNode . Select = x = > SelectNode ( x , inNewTabPage : false ) ;
t reeView. Root = assemblyListTreeNode ;
AssemblyT reeView. Root = assemblyListTreeNode ;
if ( assemblyList . ListName = = AssemblyListManager . DefaultListName )
#if DEBUG
@ -662,6 +705,7 @@ namespace ICSharpCode.ILSpy
@@ -662,6 +705,7 @@ namespace ICSharpCode.ILSpy
void filterSettings_PropertyChanged ( object sender , PropertyChangedEventArgs e )
{
RefreshTreeView ( ) ;
RefreshTreeViewFilter ( ) ;
if ( e . PropertyName = = "Language" | | e . PropertyName = = "LanguageVersion" ) {
DecompileSelectedNodes ( recordHistory : false ) ;
@ -683,7 +727,17 @@ namespace ICSharpCode.ILSpy
@@ -683,7 +727,17 @@ namespace ICSharpCode.ILSpy
#region Node Selection
public void SelectNode ( SharpTreeNode obj , bool inNewTabPage = false )
public void SelectNode ( SharpTreeNode obj )
{
SelectNode ( obj , false ) ;
}
public void SelectNode ( SharpTreeNode obj , bool inNewTabPage )
{
SelectNode ( obj , inNewTabPage , true ) ;
}
public void SelectNode ( SharpTreeNode obj , bool inNewTabPage , bool setFocus )
{
if ( obj ! = null ) {
if ( ! obj . AncestorsAndSelf ( ) . Any ( node = > node . IsHidden ) ) {
@ -694,12 +748,16 @@ namespace ICSharpCode.ILSpy
@@ -694,12 +748,16 @@ namespace ICSharpCode.ILSpy
LanguageVersion = CurrentLanguageVersion
} ) ;
DockWorkspace . Instance . ActiveTabPage = DockWorkspace . Instance . TabPages . Last ( ) ;
t reeView. SelectedItem = null ;
AssemblyT reeView. SelectedItem = null ;
}
// Set both the selection and focus to ensure that keyboard navigation works as expected.
treeView . FocusNode ( obj ) ;
treeView . SelectedItem = obj ;
if ( setFocus ) {
AssemblyTreeView . FocusNode ( obj ) ;
} else {
AssemblyTreeView . ScrollIntoView ( obj ) ;
}
AssemblyTreeView . SelectedItem = obj ;
} else {
MessageBox . Show ( "Navigation failed because the target is hidden or a compiler-generated class.\n" +
"Please disable all filters that might hide the item (i.e. activate " +
@ -709,7 +767,17 @@ namespace ICSharpCode.ILSpy
@@ -709,7 +767,17 @@ namespace ICSharpCode.ILSpy
}
}
public void SelectNodes ( IEnumerable < SharpTreeNode > nodes , bool inNewTabPage = false )
public void SelectNodes ( IEnumerable < SharpTreeNode > nodes )
{
SelectNodes ( nodes , false ) ;
}
public void SelectNodes ( IEnumerable < SharpTreeNode > nodes , bool inNewTabPage )
{
SelectNodes ( nodes , inNewTabPage , true ) ;
}
public void SelectNodes ( IEnumerable < SharpTreeNode > nodes , bool inNewTabPage , bool setFocus )
{
if ( nodes . Any ( ) & & nodes . All ( n = > ! n . AncestorsAndSelf ( ) . Any ( a = > a . IsHidden ) ) ) {
if ( inNewTabPage ) {
@ -721,8 +789,12 @@ namespace ICSharpCode.ILSpy
@@ -721,8 +789,12 @@ namespace ICSharpCode.ILSpy
DockWorkspace . Instance . ActiveTabPage = DockWorkspace . Instance . TabPages . Last ( ) ;
}
treeView . FocusNode ( nodes . First ( ) ) ;
treeView . SetSelectedNodes ( nodes ) ;
if ( setFocus ) {
AssemblyTreeView . FocusNode ( nodes . First ( ) ) ;
} else {
AssemblyTreeView . ScrollIntoView ( nodes . First ( ) ) ;
}
AssemblyTreeView . SetSelectedNodes ( nodes ) ;
}
}
@ -733,7 +805,7 @@ namespace ICSharpCode.ILSpy
@@ -733,7 +805,7 @@ namespace ICSharpCode.ILSpy
{
if ( path = = null )
return null ;
SharpTreeNode node = t reeView. Root ;
SharpTreeNode node = AssemblyT reeView. Root ;
SharpTreeNode bestMatch = node ;
foreach ( var element in path ) {
if ( node = = null )
@ -886,7 +958,7 @@ namespace ICSharpCode.ILSpy
@@ -886,7 +958,7 @@ namespace ICSharpCode.ILSpy
throw new ArgumentNullException ( nameof ( fileNames ) ) ;
if ( focusNode )
t reeView. UnselectAll ( ) ;
AssemblyT reeView. UnselectAll ( ) ;
LoadAssemblies ( fileNames , focusNode : focusNode ) ;
}
@ -912,7 +984,7 @@ namespace ICSharpCode.ILSpy
@@ -912,7 +984,7 @@ namespace ICSharpCode.ILSpy
else {
var node = assemblyListTreeNode . FindAssemblyNode ( nugetAsm ) ;
if ( node ! = null & & focusNode ) {
t reeView. SelectedItems . Add ( node ) ;
AssemblyT reeView. SelectedItems . Add ( node ) ;
lastNode = node ;
}
}
@ -930,7 +1002,7 @@ namespace ICSharpCode.ILSpy
@@ -930,7 +1002,7 @@ namespace ICSharpCode.ILSpy
else {
var node = assemblyListTreeNode . FindAssemblyNode ( asm ) ;
if ( node ! = null & & focusNode ) {
t reeView. SelectedItems . Add ( node ) ;
AssemblyT reeView. SelectedItems . Add ( node ) ;
lastNode = node ;
}
}
@ -939,17 +1011,22 @@ namespace ICSharpCode.ILSpy
@@ -939,17 +1011,22 @@ namespace ICSharpCode.ILSpy
}
if ( lastNode ! = null & & focusNode )
t reeView. FocusNode ( lastNode ) ;
AssemblyT reeView. FocusNode ( lastNode ) ;
}
}
void RefreshCommandExecuted ( object sender , ExecutedRoutedEventArgs e )
{
RefreshTreeView ( ) ;
}
void RefreshTreeView ( )
{
try {
refreshInProgress = true ;
var path = GetPathForNode ( treeView . SelectedItem as SharpTreeNode ) ;
var path = GetPathForNode ( AssemblyT reeView. SelectedItem as SharpTreeNode ) ;
ShowAssemblyList ( AssemblyListManager . LoadList ( ILSpySettings . Load ( ) , assemblyList . ListName ) ) ;
SelectNode ( FindNodeByPath ( path , true ) ) ;
SelectNode ( FindNodeByPath ( path , true ) , false , false ) ;
} finally {
refreshInProgress = false ;
}
@ -957,7 +1034,7 @@ namespace ICSharpCode.ILSpy
@@ -957,7 +1034,7 @@ namespace ICSharpCode.ILSpy
void SearchCommandExecuted ( object sender , ExecutedRoutedEventArgs e )
{
SearchPaneModel . Instance . Show ( ) ;
DockWorkspace . Instance . ShowToolPane ( SearchPaneModel . PaneContentId ) ;
}
#endregion
@ -977,20 +1054,20 @@ namespace ICSharpCode.ILSpy
@@ -977,20 +1054,20 @@ namespace ICSharpCode.ILSpy
if ( ignoreDecompilationRequests )
return ;
if ( t reeView. SelectedItems . Count = = 0 & & refreshInProgress )
if ( AssemblyT reeView. SelectedItems . Count = = 0 & & refreshInProgress )
return ;
if ( recordHistory ) {
var currentState = DockWorkspace . Instance . ActiveTabPage . GetState ( ) ;
if ( currentState ! = null )
history . UpdateCurrent ( new NavigationState ( currentState ) ) ;
history . Record ( new NavigationState ( t reeView. SelectedItems . OfType < SharpTreeNode > ( ) ) ) ;
history . Record ( new NavigationState ( AssemblyT reeView. SelectedItems . OfType < SharpTreeNode > ( ) ) ) ;
}
DockWorkspace . Instance . ActiveTabPage . SupportsLanguageSwitching = true ;
if ( t reeView. SelectedItems . Count = = 1 ) {
ILSpyTreeNode node = t reeView. SelectedItem as ILSpyTreeNode ;
if ( AssemblyT reeView. SelectedItems . Count = = 1 ) {
ILSpyTreeNode node = AssemblyT reeView. SelectedItem as ILSpyTreeNode ;
if ( node ! = null & & node . View ( DockWorkspace . Instance . ActiveTabPage ) )
return ;
}
@ -1029,7 +1106,7 @@ namespace ICSharpCode.ILSpy
@@ -1029,7 +1106,7 @@ namespace ICSharpCode.ILSpy
public IEnumerable < ILSpyTreeNode > SelectedNodes {
get {
return t reeView. GetTopLevelSelection ( ) . OfType < ILSpyTreeNode > ( ) ;
return AssemblyT reeView. GetTopLevelSelection ( ) . OfType < ILSpyTreeNode > ( ) ;
}
}
#endregion
@ -1071,12 +1148,12 @@ namespace ICSharpCode.ILSpy
@@ -1071,12 +1148,12 @@ namespace ICSharpCode.ILSpy
var newState = forward ? history . GoForward ( ) : history . GoBack ( ) ;
ignoreDecompilationRequests = true ;
t reeView. SelectedItems . Clear ( ) ;
AssemblyT reeView. SelectedItems . Clear ( ) ;
foreach ( var node in newState . TreeNodes ) {
t reeView. SelectedItems . Add ( node ) ;
AssemblyT reeView. SelectedItems . Add ( node ) ;
}
if ( newState . TreeNodes . Any ( ) )
t reeView. FocusNode ( newState . TreeNodes . First ( ) ) ;
AssemblyT reeView. FocusNode ( newState . TreeNodes . First ( ) ) ;
ignoreDecompilationRequests = false ;
DecompileSelectedNodes ( newState . ViewState as DecompilerTextViewState , false ) ;
}
@ -1136,8 +1213,8 @@ namespace ICSharpCode.ILSpy
@@ -1136,8 +1213,8 @@ namespace ICSharpCode.ILSpy
{
base . OnClosing ( e ) ;
sessionSettings . ActiveAssemblyList = assemblyList . ListName ;
sessionSettings . ActiveTreeViewPath = GetPathForNode ( t reeView. SelectedItem as SharpTreeNode ) ;
sessionSettings . ActiveAutoLoadedAssembly = GetAutoLoadedAssemblyNode ( t reeView. SelectedItem as SharpTreeNode ) ;
sessionSettings . ActiveTreeViewPath = GetPathForNode ( AssemblyT reeView. SelectedItem as SharpTreeNode ) ;
sessionSettings . ActiveAutoLoadedAssembly = GetAutoLoadedAssemblyNode ( AssemblyT reeView. SelectedItem as SharpTreeNode ) ;
sessionSettings . WindowBounds = this . RestoreBounds ;
sessionSettings . DockLayout . Serialize ( new XmlLayoutSerializer ( DockManager ) ) ;
sessionSettings . Save ( ) ;
@ -1161,7 +1238,7 @@ namespace ICSharpCode.ILSpy
@@ -1161,7 +1238,7 @@ namespace ICSharpCode.ILSpy
public void UnselectAll ( )
{
t reeView. UnselectAll ( ) ;
AssemblyT reeView. UnselectAll ( ) ;
}
public void SetStatus ( string status , Brush foreground )