mirror of https://github.com/icsharpcode/ILSpy.git
Browse Source
Note: due to massive conflicts, this merge effectively reverts Christoph's ILSpy.AddIn commits from 2017-03-05.pull/863/head
29 changed files with 309 additions and 25 deletions
|
After Width: | Height: | Size: 469 B |
|
Before Width: | Height: | Size: 262 B After Width: | Height: | Size: 417 B |
|
Before Width: | Height: | Size: 315 B After Width: | Height: | Size: 347 B |
|
After Width: | Height: | Size: 710 B |
@ -0,0 +1,42 @@ |
|||||||
|
using System.Windows; |
||||||
|
using Mono.Cecil; |
||||||
|
|
||||||
|
namespace ICSharpCode.ILSpy.TreeNodes |
||||||
|
{ |
||||||
|
[ExportContextMenuEntry(Header = "Copy FQ Name", Icon = "images/Copy.png", Order = 9999)] |
||||||
|
public class CopyFullyQualifiedTypeNameContextMenuEntry : IContextMenuEntry |
||||||
|
{ |
||||||
|
public bool IsVisible(TextViewContext context) |
||||||
|
{ |
||||||
|
return GetTypeNodeFromContext(context) != null; |
||||||
|
} |
||||||
|
|
||||||
|
public bool IsEnabled(TextViewContext context) => true; |
||||||
|
|
||||||
|
public void Execute(TextViewContext context) |
||||||
|
{ |
||||||
|
var typeDefinition = GetTypeNodeFromContext(context)?.TypeDefinition; |
||||||
|
if (typeDefinition == null) return; |
||||||
|
|
||||||
|
Clipboard.SetText(GetFullyQualifiedName(typeDefinition)); |
||||||
|
} |
||||||
|
|
||||||
|
private TypeTreeNode GetTypeNodeFromContext(TextViewContext context) |
||||||
|
{ |
||||||
|
return context.SelectedTreeNodes?.Length == 1 ? context.SelectedTreeNodes[0] as TypeTreeNode : null; |
||||||
|
} |
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Resolve full type name using .NET type representation for nested types.
|
||||||
|
/// </summary>
|
||||||
|
private string GetFullyQualifiedName(TypeDefinition typeDefinition) |
||||||
|
{ |
||||||
|
if (typeDefinition.IsNested) |
||||||
|
{ |
||||||
|
return $"{GetFullyQualifiedName(typeDefinition.DeclaringType)}+{typeDefinition.Name}"; |
||||||
|
} |
||||||
|
|
||||||
|
return $"{typeDefinition.Namespace}.{typeDefinition.Name}"; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,21 @@ |
|||||||
|
using System; |
||||||
|
using System.Collections.Generic; |
||||||
|
using System.Linq; |
||||||
|
using System.Text; |
||||||
|
using System.Windows.Automation; |
||||||
|
using System.Windows.Automation.Peers; |
||||||
|
|
||||||
|
namespace ICSharpCode.TreeView |
||||||
|
{ |
||||||
|
class SharpTreeViewAutomationPeer : FrameworkElementAutomationPeer |
||||||
|
{ |
||||||
|
internal SharpTreeViewAutomationPeer(SharpTreeView owner ): base(owner) |
||||||
|
{ |
||||||
|
} |
||||||
|
//private SharpTreeView SharpTreeView { get { return (SharpTreeView)base.Owner; } }
|
||||||
|
protected override AutomationControlType GetAutomationControlTypeCore() |
||||||
|
{ |
||||||
|
return AutomationControlType.Tree; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,77 @@ |
|||||||
|
using System; |
||||||
|
using System.Collections.Generic; |
||||||
|
using System.ComponentModel; |
||||||
|
using System.Linq; |
||||||
|
using System.Text; |
||||||
|
using System.Windows; |
||||||
|
using System.Windows.Automation; |
||||||
|
using System.Windows.Automation.Peers; |
||||||
|
using System.Windows.Automation.Provider; |
||||||
|
|
||||||
|
namespace ICSharpCode.TreeView |
||||||
|
{ |
||||||
|
class SharpTreeViewItemAutomationPeer : FrameworkElementAutomationPeer, IExpandCollapseProvider |
||||||
|
{ |
||||||
|
internal SharpTreeViewItemAutomationPeer(SharpTreeViewItem owner) |
||||||
|
: base(owner) |
||||||
|
{ |
||||||
|
SharpTreeViewItem.DataContextChanged += OnDataContextChanged; |
||||||
|
SharpTreeNode node = SharpTreeViewItem.DataContext as SharpTreeNode; |
||||||
|
if (node == null) return; |
||||||
|
|
||||||
|
node.PropertyChanged += OnPropertyChanged; |
||||||
|
} |
||||||
|
private SharpTreeViewItem SharpTreeViewItem { get { return (SharpTreeViewItem)base.Owner; } } |
||||||
|
protected override AutomationControlType GetAutomationControlTypeCore() |
||||||
|
{ |
||||||
|
return AutomationControlType.TreeItem; |
||||||
|
} |
||||||
|
|
||||||
|
public override object GetPattern(PatternInterface patternInterface) |
||||||
|
{ |
||||||
|
if (patternInterface == PatternInterface.ExpandCollapse) |
||||||
|
return this; |
||||||
|
return base.GetPattern(patternInterface); |
||||||
|
} |
||||||
|
|
||||||
|
public void Collapse() |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
public void Expand() |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
public ExpandCollapseState ExpandCollapseState { |
||||||
|
get { |
||||||
|
SharpTreeNode node = SharpTreeViewItem.DataContext as SharpTreeNode; |
||||||
|
if (node == null || !node.ShowExpander) |
||||||
|
return ExpandCollapseState.LeafNode; |
||||||
|
return node.IsExpanded ? ExpandCollapseState.Expanded : ExpandCollapseState.Collapsed; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private void OnPropertyChanged(object sender, PropertyChangedEventArgs e) |
||||||
|
{ |
||||||
|
if (e.PropertyName != "IsExpanded") return; |
||||||
|
SharpTreeNode node = sender as SharpTreeNode; |
||||||
|
if (node == null || node.Children.Count == 0) return; |
||||||
|
bool newValue = node.IsExpanded; |
||||||
|
bool oldValue = !newValue; |
||||||
|
RaisePropertyChangedEvent( |
||||||
|
ExpandCollapsePatternIdentifiers.ExpandCollapseStateProperty, |
||||||
|
oldValue ? ExpandCollapseState.Expanded : ExpandCollapseState.Collapsed, |
||||||
|
newValue ? ExpandCollapseState.Expanded : ExpandCollapseState.Collapsed); |
||||||
|
} |
||||||
|
|
||||||
|
private void OnDataContextChanged(object sender, DependencyPropertyChangedEventArgs e) |
||||||
|
{ |
||||||
|
SharpTreeNode oldNode = e.OldValue as SharpTreeNode; |
||||||
|
if (oldNode != null) |
||||||
|
oldNode.PropertyChanged -= OnPropertyChanged; |
||||||
|
SharpTreeNode newNode = e.NewValue as SharpTreeNode; |
||||||
|
if (newNode != null) |
||||||
|
newNode.PropertyChanged += OnPropertyChanged; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
Loading…
Reference in new issue