Browse Source

#358 Separate automatically-loaded assemblies from manually loaded assemblies

The assembly list is not automatically sorted into explicit/auto loaded
groups at the moment. Sorting the list loses the tree state (expanded
nodes/selections)...
pull/569/head
Ed Harvey 11 years ago
parent
commit
60fe27f744
  1. 2
      ILSpy/AssemblyList.cs
  2. 19
      ILSpy/LoadedAssembly.cs
  3. 37
      ILSpy/TreeNodes/AssemblyTreeNode.cs
  4. 13
      ILSpy/TreeNodes/ILSpyTreeNode.cs

2
ILSpy/AssemblyList.cs

@ -88,7 +88,7 @@ namespace ICSharpCode.ILSpy
return new XElement( return new XElement(
"List", "List",
new XAttribute("name", this.ListName), new XAttribute("name", this.ListName),
assemblies.Select(asm => new XElement("Assembly", asm.FileName)) assemblies.Where(asm => !asm.IsAutoLoaded).Select(asm => new XElement("Assembly", asm.FileName))
); );
} }

19
ILSpy/LoadedAssembly.cs

@ -103,7 +103,9 @@ namespace ICSharpCode.ILSpy
public bool HasLoadError { public bool HasLoadError {
get { return assemblyTask.IsFaulted; } get { return assemblyTask.IsFaulted; }
} }
public bool IsAutoLoaded { get; set; }
ModuleDefinition LoadAssembly(object state) ModuleDefinition LoadAssembly(object state)
{ {
var stream = state as Stream; var stream = state as Stream;
@ -253,7 +255,9 @@ namespace ICSharpCode.ILSpy
file = Path.Combine(dir, name.Name + ".exe"); file = Path.Combine(dir, name.Name + ".exe");
} }
if (file != null) { if (file != null) {
return assemblyList.OpenAssembly(file); var loaded = assemblyList.OpenAssembly(file);
loaded.IsAutoLoaded = true;
return loaded;
} else { } else {
return null; return null;
} }
@ -298,15 +302,24 @@ namespace ICSharpCode.ILSpy
{ {
public override int Compare(LoadedAssembly x, LoadedAssembly y) public override int Compare(LoadedAssembly x, LoadedAssembly y)
{ {
// correctly loaded assemblies sort first, then assemblies with errors // sort order:
// explicitly loaded assemblies
// auto-loaded assemblies
// assemblies with errors
if (x.IsLoaded && y.HasLoadError) if (x.IsLoaded && y.HasLoadError)
return -1; return -1;
if (x.HasLoadError && y.IsLoaded) if (x.HasLoadError && y.IsLoaded)
return 1; return 1;
if (!x.IsAutoLoaded && y.IsAutoLoaded)
return -1;
if (x.IsAutoLoaded && !y.IsAutoLoaded)
return 1;
// within above groups, sort by assembly name // within above groups, sort by assembly name
return x.Text.CompareTo(y.Text); return x.Text.CompareTo(y.Text);
} }
} }
} }
} }

37
ILSpy/TreeNodes/AssemblyTreeNode.cs

@ -63,6 +63,13 @@ namespace ICSharpCode.ILSpy.TreeNodes
get { return assembly; } get { return assembly; }
} }
public override bool IsAutoLoaded
{
get {
return assembly.IsAutoLoaded;
}
}
public override object Text public override object Text
{ {
get { return HighlightSearchMatch(assembly.Text); } get { return HighlightSearchMatch(assembly.Text); }
@ -310,6 +317,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
} }
} }
} }
[ExportContextMenuEntryAttribute(Header = "_Load Dependencies")] [ExportContextMenuEntryAttribute(Header = "_Load Dependencies")]
sealed class LoadDependencies : IContextMenuEntry sealed class LoadDependencies : IContextMenuEntry
{ {
@ -340,4 +348,33 @@ namespace ICSharpCode.ILSpy.TreeNodes
MainWindow.Instance.RefreshDecompiledView(); MainWindow.Instance.RefreshDecompiledView();
} }
} }
[ExportContextMenuEntryAttribute(Header = "_Add To Main List")]
sealed class AddToMainList : IContextMenuEntry
{
public bool IsVisible(TextViewContext context)
{
if (context.SelectedTreeNodes == null)
return false;
return context.SelectedTreeNodes.Where(n => n is AssemblyTreeNode).Any(n=>((AssemblyTreeNode)n).IsAutoLoaded);
}
public bool IsEnabled(TextViewContext context)
{
return true;
}
public void Execute(TextViewContext context)
{
if (context.SelectedTreeNodes == null)
return;
foreach (var node in context.SelectedTreeNodes) {
var loadedAssm = ((AssemblyTreeNode)node).LoadedAssembly;
if (!loadedAssm.HasLoadError) {
loadedAssm.IsAutoLoaded = false;
node.RaisePropertyChanged("Foreground");
}
}
}
}
} }

13
ILSpy/TreeNodes/ILSpyTreeNode.cs

@ -170,11 +170,22 @@ namespace ICSharpCode.ILSpy.TreeNodes
public virtual bool IsPublicAPI { public virtual bool IsPublicAPI {
get { return true; } get { return true; }
} }
public virtual bool IsAutoLoaded
{
get { return false; }
}
public override System.Windows.Media.Brush Foreground { public override System.Windows.Media.Brush Foreground {
get { get {
if (IsPublicAPI) if (IsPublicAPI)
return base.Foreground; if (IsAutoLoaded) {
// HACK: should not be hard coded?
return System.Windows.Media.Brushes.SteelBlue;
}
else {
return base.Foreground;
}
else else
return System.Windows.SystemColors.GrayTextBrush; return System.Windows.SystemColors.GrayTextBrush;
} }

Loading…
Cancel
Save