@@ -418,17 +418,22 @@ void ShowAssemblyList(AssemblyList assemblyList)
418
418
419
419
Root = assemblyListTreeNode ;
420
420
421
+ var mainWindow = Application . Current ? . MainWindow ;
422
+
423
+ if ( mainWindow == null )
424
+ return ;
425
+
421
426
if ( assemblyList . ListName == AssemblyListManager . DefaultListName )
422
427
#if DEBUG
423
- this . Title = $ "ILSpy { DecompilerVersionInfo . FullVersion } ";
428
+ mainWindow . Title = $ "ILSpy { DecompilerVersionInfo . FullVersion } ";
424
429
#else
425
- this . Title = "ILSpy" ;
430
+ mainWindow . Title = "ILSpy" ;
426
431
#endif
427
432
else
428
433
#if DEBUG
429
- this . Title = $ "ILSpy { DecompilerVersionInfo . FullVersion } - " + assemblyList . ListName ;
434
+ mainWindow . Title = $ "ILSpy { DecompilerVersionInfo . FullVersion } - " + assemblyList . ListName ;
430
435
#else
431
- this . Title = "ILSpy - " + assemblyList . ListName ;
436
+ mainWindow . Title = "ILSpy - " + assemblyList . ListName ;
432
437
#endif
433
438
}
434
439
@@ -506,7 +511,7 @@ internal void SelectNodes(IEnumerable<SharpTreeNode> nodes)
506
511
{
507
512
// Ensure nodes exist
508
513
var nodesList = nodes . Select ( n => FindNodeByPath ( GetPathForNode ( n ) , true ) )
509
- . Where ( n => n != null )
514
+ . ExceptNullItems ( )
510
515
. ToArray ( ) ;
511
516
512
517
if ( ! nodesList . Any ( ) || nodesList . Any ( n => n . AncestorsAndSelf ( ) . Any ( a => a . IsHidden ) ) )
@@ -516,12 +521,22 @@ internal void SelectNodes(IEnumerable<SharpTreeNode> nodes)
516
521
517
522
if ( SelectedItems . SequenceEqual ( nodesList ) )
518
523
{
519
- Dispatcher . BeginInvoke ( RefreshDecompiledView ) ;
520
524
return ;
521
525
}
522
526
523
- SelectedItems . Clear ( ) ;
524
- SelectedItems . AddRange ( nodesList ) ;
527
+ if ( this . isNavigatingHistory )
528
+ {
529
+ SelectedItems . Clear ( ) ;
530
+ SelectedItems . AddRange ( nodesList ) ;
531
+ }
532
+ else
533
+ {
534
+ // defer selection change, so it does not interfere with the focus of the tab page.
535
+ Dispatcher . BeginInvoke ( ( ) => {
536
+ SelectedItems . Clear ( ) ;
537
+ SelectedItems . AddRange ( nodesList ) ;
538
+ } ) ;
539
+ }
525
540
}
526
541
527
542
/// <summary>
@@ -543,10 +558,8 @@ public SharpTreeNode FindNodeByPath(string[] path, bool returnBestMatch)
543
558
ilSpyTreeNode . EnsureChildrenFiltered ( ) ;
544
559
node = node . Children . FirstOrDefault ( c => c . ToString ( ) == element ) ;
545
560
}
546
- if ( returnBestMatch )
547
- return node ?? bestMatch ;
548
- else
549
- return node ;
561
+
562
+ return returnBestMatch ? node ?? bestMatch : node ;
550
563
}
551
564
552
565
/// <summary>
@@ -692,20 +705,28 @@ void TreeView_SelectionChanged()
692
705
{
693
706
if ( SelectedItems . Count > 0 )
694
707
{
708
+ var activeTabPage = DockWorkspace . Instance . ActiveTabPage ;
709
+
695
710
if ( ! isNavigatingHistory )
696
711
{
697
- var activeTabPage = DockWorkspace . Instance . ActiveTabPage ;
698
- var currentState = activeTabPage . GetState ( ) ;
699
- if ( currentState != null )
700
- history . UpdateCurrent ( new NavigationState ( activeTabPage , currentState ) ) ;
701
712
history . Record ( new NavigationState ( activeTabPage , SelectedItems ) ) ;
702
713
}
703
714
704
715
var delayDecompilationRequestDueToContextMenu = Mouse . RightButton == MouseButtonState . Pressed ;
705
716
706
717
if ( ! delayDecompilationRequestDueToContextMenu )
707
718
{
708
- DecompileSelectedNodes ( ) ;
719
+ var decompiledNodes = activeTabPage
720
+ . GetState ( )
721
+ ? . DecompiledNodes
722
+ ? . Select ( n => FindNodeByPath ( GetPathForNode ( n ) , true ) )
723
+ . ExceptNullItems ( )
724
+ . ToArray ( ) ?? [ ] ;
725
+
726
+ if ( ! decompiledNodes . SequenceEqual ( SelectedItems ) )
727
+ {
728
+ DecompileSelectedNodes ( ) ;
729
+ }
709
730
}
710
731
else
711
732
{
@@ -743,7 +764,7 @@ private void DecompileSelectedNodes(DecompilerTextViewState newState = null)
743
764
}
744
765
if ( newState ? . ViewedUri != null )
745
766
{
746
- NavigateTo ( new ( newState . ViewedUri , null ) , recordHistory : false ) ;
767
+ NavigateTo ( new ( newState . ViewedUri , null ) ) ;
747
768
return ;
748
769
}
749
770
@@ -780,7 +801,12 @@ public void NavigateHistory(bool forward)
780
801
history . UpdateCurrent ( new NavigationState ( tabPage , state ) ) ;
781
802
var newState = forward ? history . GoForward ( ) : history . GoBack ( ) ;
782
803
783
- DockWorkspace . Instance . ActiveTabPage = newState . TabPage ;
804
+ TabPageModel activeTabPage = newState . TabPage ;
805
+
806
+ if ( ! DockWorkspace . Instance . TabPages . Contains ( activeTabPage ) )
807
+ DockWorkspace . Instance . AddTabPage ( activeTabPage ) ;
808
+ else
809
+ DockWorkspace . Instance . ActiveTabPage = activeTabPage ;
784
810
785
811
SelectNodes ( newState . TreeNodes ) ;
786
812
}
@@ -789,7 +815,7 @@ public void NavigateHistory(bool forward)
789
815
790
816
public bool CanNavigateForward => history . CanNavigateForward ;
791
817
792
- internal void NavigateTo ( RequestNavigateEventArgs e , bool recordHistory = true , bool inNewTabPage = false )
818
+ internal void NavigateTo ( RequestNavigateEventArgs e , bool inNewTabPage = false )
793
819
{
794
820
if ( e . Uri . Scheme == "resource" )
795
821
{
@@ -830,7 +856,7 @@ internal void NavigateTo(RequestNavigateEventArgs e, bool recordHistory = true,
830
856
831
857
void RecordHistory ( )
832
858
{
833
- if ( ! recordHistory )
859
+ if ( isNavigatingHistory )
834
860
return ;
835
861
TabPageModel tabPage = DockWorkspace . Instance . ActiveTabPage ;
836
862
var currentState = tabPage . GetState ( ) ;
0 commit comments