Browse Source
git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@4734 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61shortcuts
11 changed files with 249 additions and 278 deletions
@ -0,0 +1,22 @@ |
|||||||
|
// <file>
|
||||||
|
// <copyright see="prj:///doc/copyright.txt"/>
|
||||||
|
// <license see="prj:///doc/license.txt"/>
|
||||||
|
// <owner name="Siegfried Pammer" email="sie_pam@gmx.at"/>
|
||||||
|
// <version>$Revision$</version>
|
||||||
|
// </file>
|
||||||
|
|
||||||
|
using System; |
||||||
|
using System.Collections.Generic; |
||||||
|
|
||||||
|
namespace ICSharpCode.XamlBinding |
||||||
|
{ |
||||||
|
public class NodeWrapper { |
||||||
|
public string ElementName { get; set; } |
||||||
|
public string Name { get; set; } |
||||||
|
|
||||||
|
public int StartOffset { get; set; } |
||||||
|
public int EndOffset { get; set; } |
||||||
|
|
||||||
|
public IList<NodeWrapper> Children { get; set; } |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,138 @@ |
|||||||
|
// <file>
|
||||||
|
// <copyright see="prj:///doc/copyright.txt"/>
|
||||||
|
// <license see="prj:///doc/license.txt"/>
|
||||||
|
// <owner name="Siegfried Pammer" email="sie_pam@gmx.at"/>
|
||||||
|
// <version>$Revision$</version>
|
||||||
|
// </file>
|
||||||
|
|
||||||
|
using System; |
||||||
|
using System.Linq; |
||||||
|
using System.Windows; |
||||||
|
using System.Windows.Controls; |
||||||
|
using System.Windows.Input; |
||||||
|
|
||||||
|
using ICSharpCode.SharpDevelop.Editor; |
||||||
|
using ICSharpCode.TreeView; |
||||||
|
|
||||||
|
namespace ICSharpCode.XamlBinding |
||||||
|
{ |
||||||
|
class XamlOutlineNode : SharpTreeNode { |
||||||
|
string elementName, name; |
||||||
|
|
||||||
|
public string ElementName { |
||||||
|
get { return elementName; } |
||||||
|
set { |
||||||
|
this.elementName = value; |
||||||
|
this.RaisePropertyChanged("Text"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public string Name { |
||||||
|
get { return name; } |
||||||
|
set { |
||||||
|
this.name = value; |
||||||
|
this.RaisePropertyChanged("Text"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public ITextAnchor Marker { get; set; } |
||||||
|
public ITextAnchor EndMarker { get; set; } |
||||||
|
public ITextEditor Editor { get; set; } |
||||||
|
|
||||||
|
public override bool CanDrag(SharpTreeNode[] nodes) |
||||||
|
{ |
||||||
|
return nodes.All(node => node.Parent != null); |
||||||
|
} |
||||||
|
|
||||||
|
public override DropEffect CanDrop(IDataObject data, DropEffect requestedEffect) |
||||||
|
{ |
||||||
|
return DropEffect.Move; |
||||||
|
} |
||||||
|
|
||||||
|
public override bool CanCopy(SharpTreeNode[] nodes) |
||||||
|
{ |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
public string GetMarkupText() |
||||||
|
{ |
||||||
|
return Editor.Document.GetText(Marker.Offset, EndMarker.Offset - Marker.Offset); |
||||||
|
} |
||||||
|
|
||||||
|
public override IDataObject Copy(SharpTreeNode[] nodes) |
||||||
|
{ |
||||||
|
string[] data = nodes |
||||||
|
.OfType<XamlOutlineNode>() |
||||||
|
.Select(item => item.GetMarkupText()) |
||||||
|
.ToArray(); |
||||||
|
var dataObject = new DataObject(); |
||||||
|
dataObject.SetData(typeof(string[]), data); |
||||||
|
|
||||||
|
return dataObject; |
||||||
|
} |
||||||
|
|
||||||
|
public override bool CanDelete(SharpTreeNode[] nodes) |
||||||
|
{ |
||||||
|
return nodes.All(node => node.Parent != null); |
||||||
|
} |
||||||
|
|
||||||
|
public override void Drop(IDataObject data, int index, DropEffect finalEffect) |
||||||
|
{ |
||||||
|
try { |
||||||
|
string insertText = (data.GetData(typeof(string[])) as string[]) |
||||||
|
.Aggregate((text, part) => text += part); |
||||||
|
ITextAnchor marker; |
||||||
|
int length = 0; |
||||||
|
if (index == this.Children.Count) { |
||||||
|
if (index == 0) |
||||||
|
marker = null; |
||||||
|
else |
||||||
|
marker = (this.Children[index - 1] as XamlOutlineNode).EndMarker; |
||||||
|
if (marker == null) { |
||||||
|
marker = this.EndMarker; |
||||||
|
length = -1; // move backwards
|
||||||
|
} else { |
||||||
|
length = 2 + (this.Children[index - 1] as XamlOutlineNode).elementName.Length; |
||||||
|
} |
||||||
|
} else |
||||||
|
marker = (this.Children[index] as XamlOutlineNode).Marker; |
||||||
|
|
||||||
|
int offset = marker.Offset + length; |
||||||
|
Editor.Document.Insert(offset, insertText); |
||||||
|
} catch (Exception ex) { |
||||||
|
throw ex; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public override void Delete(SharpTreeNode[] nodes) |
||||||
|
{ |
||||||
|
DeleteCore(nodes); |
||||||
|
} |
||||||
|
|
||||||
|
public override void DeleteCore(SharpTreeNode[] nodes) |
||||||
|
{ |
||||||
|
foreach (XamlOutlineNode node in nodes.OfType<XamlOutlineNode>()) { |
||||||
|
node.Editor.Document.Remove(node.Marker.Offset, node.EndMarker.Offset - node.Marker.Offset); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
ContextMenu menu; |
||||||
|
|
||||||
|
public override ContextMenu GetContextMenu() |
||||||
|
{ |
||||||
|
if (menu == null) { |
||||||
|
menu = new ContextMenu(); |
||||||
|
menu.Items.Add(new MenuItem() { Command = ApplicationCommands.Cut }); |
||||||
|
menu.Items.Add(new MenuItem() { Command = ApplicationCommands.Copy }); |
||||||
|
menu.Items.Add(new MenuItem() { Command = ApplicationCommands.Paste }); |
||||||
|
menu.Items.Add(new Separator()); |
||||||
|
menu.Items.Add(new MenuItem() { Command = ApplicationCommands.Delete }); |
||||||
|
} |
||||||
|
return menu; |
||||||
|
} |
||||||
|
|
||||||
|
public override object Text { |
||||||
|
get { return (!string.IsNullOrEmpty(Name) ? ElementName + " (" + Name + ")" : ElementName); } |
||||||
|
} |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue