Skip to content

Commit a0f38ad

Browse files
committed
Refactor for cross platform port (#3641)
1 parent 3a27cbe commit a0f38ad

32 files changed

+1017
-565
lines changed

ICSharpCode.ILSpyX/TreeView/SharpTreeNode.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,9 +319,26 @@ public bool LazyLoading {
319319
}
320320
RaisePropertyChanged(nameof(LazyLoading));
321321
RaisePropertyChanged(nameof(ShowExpander));
322+
RaisePropertyChanged(nameof(ViewChildren));
322323
}
323324
}
324325

326+
/// <summary>
327+
/// Workaround for cross platform treeview bindings.
328+
/// </summary>
329+
public System.Collections.IEnumerable ViewChildren {
330+
get {
331+
if (LazyLoading && Children.Count == 0)
332+
return new[] { new LoadingTreeNode() };
333+
return Children;
334+
}
335+
}
336+
337+
class LoadingTreeNode : SharpTreeNode
338+
{
339+
public override object Text => "Loading...";
340+
}
341+
325342
bool canExpandRecursively = true;
326343

327344
/// <summary>

ILSpy/AboutPage.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,11 @@ private void Display(DecompilerTextView textView)
9494
};
9595

9696
var settings = settingsService.GetSettings<UpdateSettings>();
97+
#if CROSS_PLATFORM
98+
checkBox.Bind(ToggleButton.IsCheckedProperty, new Binding("AutomaticUpdateCheckEnabled") { Source = settings });
99+
#else
97100
checkBox.SetBinding(ToggleButton.IsCheckedProperty, new Binding("AutomaticUpdateCheckEnabled") { Source = settings });
101+
#endif
98102
return new StackPanel {
99103
Margin = new Thickness(0, 4, 0, 0),
100104
Cursor = Cursors.Arrow,
@@ -192,7 +196,11 @@ static void ShowAvailableVersion(AvailableVersionInfo availableVersion, StackPan
192196
stackPanel.Children.Add(
193197
new Image {
194198
Width = 16, Height = 16,
199+
#if CROSS_PLATFORM
200+
Source = Images.LoadImage(Images.OK),
201+
#else
195202
Source = Images.OK,
203+
#endif
196204
Margin = new Thickness(4, 0, 4, 0)
197205
});
198206
stackPanel.Children.Add(

ILSpy/AssemblyTree/AssemblyTreeModel.cs

Lines changed: 13 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
using System.Reflection.Metadata.Ecma335;
3030
using System.Threading.Tasks;
3131
using System.Windows;
32-
using System.Windows.Documents;
3332
using System.Windows.Input;
3433
using System.Windows.Navigation;
3534
using System.Windows.Threading;
@@ -57,7 +56,7 @@ namespace ICSharpCode.ILSpy.AssemblyTree
5756
{
5857
[ExportToolPane]
5958
[Shared]
60-
public class AssemblyTreeModel : ToolPaneModel
59+
public partial class AssemblyTreeModel : ToolPaneModel
6160
{
6261
public const string PaneContentId = "assemblyListPane";
6362

@@ -72,36 +71,6 @@ public class AssemblyTreeModel : ToolPaneModel
7271
private readonly LanguageService languageService;
7372
private readonly IExportProvider exportProvider;
7473

75-
public AssemblyTreeModel(SettingsService settingsService, LanguageService languageService, IExportProvider exportProvider)
76-
{
77-
this.settingsService = settingsService;
78-
this.languageService = languageService;
79-
this.exportProvider = exportProvider;
80-
81-
Title = Resources.Assemblies;
82-
ContentId = PaneContentId;
83-
IsCloseable = false;
84-
ShortcutKey = new KeyGesture(Key.F6);
85-
86-
MessageBus<NavigateToReferenceEventArgs>.Subscribers += JumpToReference;
87-
MessageBus<SettingsChangedEventArgs>.Subscribers += (sender, e) => Settings_PropertyChanged(sender, e);
88-
MessageBus<ApplySessionSettingsEventArgs>.Subscribers += ApplySessionSettings;
89-
MessageBus<ActiveTabPageChangedEventArgs>.Subscribers += ActiveTabPageChanged;
90-
MessageBus<TabPagesCollectionChangedEventArgs>.Subscribers += (_, e) => history.RemoveAll(s => !DockWorkspace.TabPages.Contains(s.TabPage));
91-
MessageBus<ResetLayoutEventArgs>.Subscribers += ResetLayout;
92-
MessageBus<NavigateToEventArgs>.Subscribers += (_, e) => NavigateTo(e.Request, e.InNewTabPage);
93-
MessageBus<MainWindowLoadedEventArgs>.Subscribers += (_, _) => {
94-
Initialize();
95-
Show();
96-
};
97-
98-
EventManager.RegisterClassHandler(typeof(Window), Hyperlink.RequestNavigateEvent, new RequestNavigateEventHandler((_, e) => NavigateTo(e)));
99-
100-
refreshThrottle = new(DispatcherPriority.Background, RefreshInternal);
101-
102-
AssemblyList = settingsService.CreateEmptyAssemblyList();
103-
}
104-
10574
private void Settings_PropertyChanged(object? sender, PropertyChangedEventArgs e)
10675
{
10776
if (sender is SessionSettings sessionSettings)
@@ -159,6 +128,7 @@ public SharpTreeNode[] SelectedItems {
159128
var oldSelection = selectedItems;
160129
selectedItems = value;
161130
OnPropertyChanged();
131+
// TODO: OnPropertyChanged(nameof(SelectedItem));
162132
TreeView_SelectionChanged(oldSelection, selectedItems);
163133
}
164134
}
@@ -492,24 +462,6 @@ private void assemblyList_CollectionChanged(object? sender, NotifyCollectionChan
492462
MessageBus.Send(this, new CurrentAssemblyListChangedEventArgs(e));
493463
}
494464

495-
private static void LoadInitialAssemblies(AssemblyList assemblyList)
496-
{
497-
// Called when loading an empty assembly list; so that
498-
// the user can see something initially.
499-
System.Reflection.Assembly[] initialAssemblies = {
500-
typeof(object).Assembly,
501-
typeof(Uri).Assembly,
502-
typeof(System.Linq.Enumerable).Assembly,
503-
typeof(System.Xml.XmlDocument).Assembly,
504-
typeof(System.Windows.Markup.MarkupExtension).Assembly,
505-
typeof(System.Windows.Rect).Assembly,
506-
typeof(System.Windows.UIElement).Assembly,
507-
typeof(System.Windows.FrameworkElement).Assembly
508-
};
509-
foreach (System.Reflection.Assembly asm in initialAssemblies)
510-
assemblyList.OpenAssembly(asm.Location);
511-
}
512-
513465
public AssemblyTreeNode? FindAssemblyNode(LoadedAssembly asm)
514466
{
515467
return assemblyListTreeNode?.FindAssemblyNode(asm);
@@ -540,6 +492,7 @@ public void SelectNode(SharpTreeNode? node, bool inNewTabPage = false)
540492
}
541493
else
542494
{
495+
// TODO: ExpandAncestors(node);
543496
activeView?.ScrollIntoView(node);
544497
SelectedItem = node;
545498

@@ -978,6 +931,7 @@ private void RefreshInternal()
978931
{
979932
var path = GetPathForNode(SelectedItem);
980933

934+
// TODO: (settingsService.AssemblyListManager.LoadList(AssemblyList.ListName));
981935
ShowAssemblyList(settingsService.AssemblyListManager.LoadList(AssemblyList.ListName));
982936
SelectNode(FindNodeByPath(path, true), inNewTabPage: false);
983937

@@ -998,6 +952,15 @@ private IEnumerable<SharpTreeNode> GetTopLevelSelection()
998952
return selection.Where(item => item.Ancestors().All(a => !selectionHash.Contains(a)));
999953
}
1000954

955+
// TODO: void ExpandAncestors(SharpTreeNode node)
956+
// {
957+
// foreach (var ancestor in node.Ancestors().Reverse())
958+
// {
959+
// ancestor.EnsureLazyChildren();
960+
// ancestor.IsExpanded = true;
961+
// }
962+
// }
963+
1001964
public void SetActiveView(AssemblyListPane activeView)
1002965
{
1003966
this.activeView = activeView;
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
// Copyright (c) 2019 AlphaSierraPapa for the SharpDevelop Team
2+
//
3+
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
4+
// software and associated documentation files (the "Software"), to deal in the Software
5+
// without restriction, including without limitation the rights to use, copy, modify, merge,
6+
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
7+
// to whom the Software is furnished to do so, subject to the following conditions:
8+
//
9+
// The above copyright notice and this permission notice shall be included in all copies or
10+
// substantial portions of the Software.
11+
//
12+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
13+
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
14+
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
15+
// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
16+
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
17+
// DEALINGS IN THE SOFTWARE.
18+
19+
using System;
20+
using System.Windows;
21+
using System.Windows.Documents;
22+
using System.Windows.Input;
23+
using System.Windows.Navigation;
24+
using System.Windows.Threading;
25+
26+
using ICSharpCode.ILSpy.Properties;
27+
using ICSharpCode.ILSpyX;
28+
29+
using TomsToolbox.Composition;
30+
31+
namespace ICSharpCode.ILSpy.AssemblyTree
32+
{
33+
public partial class AssemblyTreeModel
34+
{
35+
public AssemblyTreeModel(SettingsService settingsService, LanguageService languageService, IExportProvider exportProvider)
36+
{
37+
this.settingsService = settingsService;
38+
this.languageService = languageService;
39+
this.exportProvider = exportProvider;
40+
41+
Title = Resources.Assemblies;
42+
ContentId = PaneContentId;
43+
IsCloseable = false;
44+
ShortcutKey = new KeyGesture(Key.F6);
45+
46+
MessageBus<NavigateToReferenceEventArgs>.Subscribers += JumpToReference;
47+
MessageBus<SettingsChangedEventArgs>.Subscribers += (sender, e) => Settings_PropertyChanged(sender, e);
48+
MessageBus<ApplySessionSettingsEventArgs>.Subscribers += ApplySessionSettings;
49+
MessageBus<ActiveTabPageChangedEventArgs>.Subscribers += ActiveTabPageChanged;
50+
MessageBus<TabPagesCollectionChangedEventArgs>.Subscribers += (_, e) => history.RemoveAll(s => !DockWorkspace.TabPages.Contains(s.TabPage));
51+
MessageBus<ResetLayoutEventArgs>.Subscribers += ResetLayout;
52+
MessageBus<NavigateToEventArgs>.Subscribers += (_, e) => NavigateTo(e.Request, e.InNewTabPage);
53+
MessageBus<MainWindowLoadedEventArgs>.Subscribers += (_, _) => {
54+
Initialize();
55+
Show();
56+
};
57+
58+
EventManager.RegisterClassHandler(typeof(Window), Hyperlink.RequestNavigateEvent, new RequestNavigateEventHandler((_, e) => NavigateTo(e)));
59+
60+
refreshThrottle = new(DispatcherPriority.Background, RefreshInternal);
61+
62+
AssemblyList = settingsService.CreateEmptyAssemblyList();
63+
}
64+
65+
private static void LoadInitialAssemblies(AssemblyList assemblyList)
66+
{
67+
// Called when loading an empty assembly list; so that
68+
// the user can see something initially.
69+
System.Reflection.Assembly[] initialAssemblies = {
70+
typeof(object).Assembly,
71+
typeof(Uri).Assembly,
72+
typeof(System.Linq.Enumerable).Assembly,
73+
typeof(System.Xml.XmlDocument).Assembly,
74+
typeof(System.Windows.Markup.MarkupExtension).Assembly,
75+
typeof(System.Windows.Rect).Assembly,
76+
typeof(System.Windows.UIElement).Assembly,
77+
typeof(System.Windows.FrameworkElement).Assembly
78+
};
79+
foreach (System.Reflection.Assembly asm in initialAssemblies)
80+
assemblyList.OpenAssembly(asm.Location);
81+
}
82+
}
83+
}

0 commit comments

Comments
 (0)