Browse Source

Edit pin control v0.2

pull/11/head
eusebiu 15 years ago
parent
commit
1d934de1b4
  1. 1
      src/AddIns/Debugger/Debugger.AddIn/Debugger.AddIn.csproj
  2. 1
      src/AddIns/Debugger/Debugger.AddIn/Pads/Controls/WatchList.xaml.cs
  3. 1
      src/AddIns/Debugger/Debugger.AddIn/Pads/LocalVarPad.cs
  4. 1
      src/AddIns/Debugger/Debugger.AddIn/Pads/WatchPad.cs
  5. 1
      src/AddIns/Debugger/Debugger.AddIn/Pads/WatchPadCommands.cs
  6. 67
      src/AddIns/Debugger/Debugger.AddIn/Pads/WatchPadModel.cs
  7. 1
      src/AddIns/Debugger/Debugger.AddIn/TreeModel/Adapters/TreeViewVarNode.cs
  8. 1
      src/AddIns/Debugger/Debugger.AddIn/TreeModel/ArrayRangeNode.cs
  9. 1
      src/AddIns/Debugger/Debugger.AddIn/TreeModel/ChildNodesOfObject.cs
  10. 5
      src/AddIns/Debugger/Debugger.AddIn/TreeModel/ExpressionNode.cs
  11. 1
      src/AddIns/Debugger/Debugger.AddIn/TreeModel/StackFrameNode.cs
  12. 1
      src/AddIns/Debugger/Debugger.AddIn/Visualizers/ICorDebug.cs
  13. 5
      src/AddIns/Debugger/Debugger.AddIn/Visualizers/IEnumerableNode.cs
  14. 75
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/PinLayer.cs
  15. 7
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/TextArea.cs
  16. 1
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/ICSharpCode.AvalonEdit.csproj
  17. 28
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/Layer.cs
  18. 6
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/LayerPosition.cs
  19. 7
      src/Main/Base/Project/ICSharpCode.SharpDevelop.addin
  20. 4
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  21. 55
      src/Main/Base/Project/Src/Bookmarks/BookmarkConverter.cs
  22. 55
      src/Main/Base/Project/Src/Services/Debugger/Tooltips/DebuggerPopup.cs
  23. 684
      src/Main/Base/Project/Src/Services/Debugger/Tooltips/DebuggerTooltipControl.xaml
  24. 323
      src/Main/Base/Project/Src/Services/Debugger/Tooltips/DebuggerTooltipControl.xaml.cs
  25. 2
      src/Main/Base/Project/Src/Services/Debugger/Tooltips/ITreeNode.cs
  26. 54
      src/Main/Base/Project/Src/Services/Debugger/Tooltips/PinBookmark.cs
  27. 57
      src/Main/Base/Project/Src/Services/Debugger/Tooltips/PinCloseControl.xaml.cs
  28. 86
      src/Main/Base/Project/Src/Services/Debugger/Tooltips/PinningBinding.cs
  29. 123
      src/Main/Base/Project/Src/Services/Debugger/TreeNode.cs

1
src/AddIns/Debugger/Debugger.AddIn/Debugger.AddIn.csproj

@ -247,7 +247,6 @@ @@ -247,7 +247,6 @@
</Compile>
<Compile Include="Pads\DebuggerPad.cs" />
<Compile Include="Pads\RunningThreadsPad.Menu.cs" />
<Compile Include="TreeModel\TreeNode.cs" />
<Compile Include="TreeModel\Adapters\TreeViewVarNode.cs">
<SubType>Component</SubType>
</Compile>

1
src/AddIns/Debugger/Debugger.AddIn/Pads/Controls/WatchList.xaml.cs

@ -11,6 +11,7 @@ using System.Windows.Input; @@ -11,6 +11,7 @@ using System.Windows.Input;
using System.Windows.Media;
using Debugger.AddIn.TreeModel;
using ICSharpCode.SharpDevelop.Debugging;
namespace Debugger.AddIn.Pads.Controls
{

1
src/AddIns/Debugger/Debugger.AddIn/Pads/LocalVarPad.cs

@ -7,6 +7,7 @@ using Debugger.AddIn.Pads.Controls; @@ -7,6 +7,7 @@ using Debugger.AddIn.Pads.Controls;
using Debugger.AddIn.TreeModel;
using ICSharpCode.Core;
using Exception = System.Exception;
using TreeNode = ICSharpCode.SharpDevelop.Debugging.TreeNode;
namespace ICSharpCode.SharpDevelop.Gui.Pads
{

1
src/AddIns/Debugger/Debugger.AddIn/Pads/WatchPad.cs

@ -15,6 +15,7 @@ using ICSharpCode.Core.Presentation; @@ -15,6 +15,7 @@ using ICSharpCode.Core.Presentation;
using ICSharpCode.NRefactory;
using ICSharpCode.SharpDevelop.Project;
using Exception = System.Exception;
using ICSharpCode.SharpDevelop.Debugging;
namespace ICSharpCode.SharpDevelop.Gui.Pads
{

1
src/AddIns/Debugger/Debugger.AddIn/Pads/WatchPadCommands.cs

@ -17,6 +17,7 @@ using ICSharpCode.NRefactory; @@ -17,6 +17,7 @@ using ICSharpCode.NRefactory;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Gui.Pads;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Debugging;
namespace Debugger.AddIn
{

67
src/AddIns/Debugger/Debugger.AddIn/Pads/WatchPadModel.cs

@ -1,17 +1,14 @@ @@ -1,17 +1,14 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the BSD license (for details please see \src\AddIns\Debugger\Debugger.AddIn\license.txt)
using ICSharpCode.NRefactory;
using System;
using System.Windows.Forms;
using Aga.Controls.Tree;
using Aga.Controls.Tree.NodeControls;
using Debugger.AddIn.TreeModel;
using TreeNode = Debugger.AddIn.TreeModel.TreeNode;
using ICSharpCode.NRefactory;
using ICSharpCode.SharpDevelop.Debugging;
namespace ICSharpCode.SharpDevelop.Gui.Pads
{
public class TextNode : Debugger.AddIn.TreeModel.TreeNode, ISetText
public class TextNode : TreeNode, ISetText
{
public TextNode(string text, SupportedLanguage language)
{
@ -47,62 +44,4 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads @@ -47,62 +44,4 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads
IconImage = DebuggerResourceService.GetImage("Icons.16x16.Error");
}
}
public sealed class WatchItemName: NodeTextBox {
public WatchItemName()
{
this.EditEnabled = true;
this.EditOnClick = true;
}
protected override bool CanEdit(TreeNodeAdv node)
{
TreeNode content = ((TreeViewVarNode)node).Content;
return (content is ISetText) && ((ISetText)content).CanSetText;
}
public override object GetValue(TreeNodeAdv node)
{
if (node is TreeViewVarNode) {
return ((TreeViewVarNode)node).Content.Name;
} else {
// Happens during incremental search
return base.GetValue(node);
}
}
public override void SetValue(TreeNodeAdv node, object value)
{
if (string.IsNullOrEmpty(value as string))
MessageBox.Show("You can not set name to an empty string!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
else
{
// if (((TreeViewVarNode)node).Content is ExpressionNode) {
// WatchPad.Instance.Watches.RemoveAll(item => item.Name == ((ExpressionNode)((TreeViewVarNode)node).Content).Name);
// ((ExpressionNode)((TreeViewVarNode)node).Content).Name = value.ToString();
// } else {
// if (((TreeViewVarNode)node).Content is TextNode) {
// WatchPad.Instance.Watches.RemoveAll(item => item.Name == ((TextNode)((TreeViewVarNode)node).Content).Name);
// ((TextNode)((TreeViewVarNode)node).Content).Name = value.ToString();
// }
// }
//
// WatchPad.Instance.Watches.Add(new TextNode(value as string, SupportedLanguage.CSharp));
}
}
public override void MouseDown(TreeNodeAdvMouseEventArgs args)
{
if (args.Node == null) {
base.MouseDown(args);
return;
}
TreeNode content = ((TreeViewVarNode)args.Node).Content;
if (content is IContextMenu && args.Button == MouseButtons.Right) {
ContextMenuStrip menu = ((IContextMenu)content).GetContextMenu();
if (menu != null) {
menu.Show(args.Node.Tree, args.Location);
args.Handled = true;
}
} else {
base.MouseDown(args);
}
}
}
}

1
src/AddIns/Debugger/Debugger.AddIn/TreeModel/Adapters/TreeViewVarNode.cs

@ -10,6 +10,7 @@ using System.Windows.Forms; @@ -10,6 +10,7 @@ using System.Windows.Forms;
using Aga.Controls.Tree;
using Aga.Controls.Tree.NodeControls;
using ICSharpCode.Core;
using TreeNode = ICSharpCode.SharpDevelop.Debugging.TreeNode;
namespace Debugger.AddIn.TreeModel
{

1
src/AddIns/Debugger/Debugger.AddIn/TreeModel/ArrayRangeNode.cs

@ -5,6 +5,7 @@ using System; @@ -5,6 +5,7 @@ using System;
using System.Collections.Generic;
using System.Text;
using ICSharpCode.NRefactory.Ast;
using ICSharpCode.SharpDevelop.Debugging;
namespace Debugger.AddIn.TreeModel
{

1
src/AddIns/Debugger/Debugger.AddIn/TreeModel/ChildNodesOfObject.cs

@ -11,6 +11,7 @@ using ICSharpCode.Core; @@ -11,6 +11,7 @@ using ICSharpCode.Core;
using ICSharpCode.NRefactory.Ast;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Services;
using ICSharpCode.SharpDevelop.Debugging;
namespace Debugger.AddIn.TreeModel
{

5
src/AddIns/Debugger/Debugger.AddIn/TreeModel/ExpressionNode.cs

@ -4,22 +4,19 @@ @@ -4,22 +4,19 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Globalization;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using Debugger.AddIn.Visualizers;
using Debugger.AddIn.Visualizers.Utils;
using Debugger.MetaData;
using ICSharpCode.Core;
using ICSharpCode.Core.WinForms;
using ICSharpCode.NRefactory.Ast;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Debugging;
using ICSharpCode.SharpDevelop.Gui.Pads;
using ICSharpCode.SharpDevelop.Services;
using TreeNode = ICSharpCode.SharpDevelop.Debugging.TreeNode;
namespace Debugger.AddIn.TreeModel
{

1
src/AddIns/Debugger/Debugger.AddIn/TreeModel/StackFrameNode.cs

@ -4,6 +4,7 @@ @@ -4,6 +4,7 @@
using Debugger.MetaData;
using System.Collections.Generic;
using ICSharpCode.NRefactory.Ast;
using ICSharpCode.SharpDevelop.Debugging;
namespace Debugger.AddIn.TreeModel
{

1
src/AddIns/Debugger/Debugger.AddIn/Visualizers/ICorDebug.cs

@ -5,6 +5,7 @@ using Debugger.Interop.CorDebug; @@ -5,6 +5,7 @@ using Debugger.Interop.CorDebug;
using System;
using System.Collections.Generic;
using Debugger.MetaData;
using ICSharpCode.SharpDevelop.Debugging;
namespace Debugger.AddIn.TreeModel
{

5
src/AddIns/Debugger/Debugger.AddIn/Visualizers/IEnumerableNode.cs

@ -1,12 +1,11 @@ @@ -1,12 +1,11 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the BSD license (for details please see \src\AddIns\Debugger\Debugger.AddIn\license.txt)
using Debugger.MetaData;
using System;
using System.Collections.Generic;
using System.Linq;
using Debugger.AddIn.Visualizers.Utils;
using Debugger.MetaData;
using ICSharpCode.NRefactory.Ast;
using ICSharpCode.SharpDevelop.Debugging;
namespace Debugger.AddIn.TreeModel
{

75
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/PinLayer.cs

@ -0,0 +1,75 @@ @@ -0,0 +1,75 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Media;
using ICSharpCode.AvalonEdit.Rendering;
namespace ICSharpCode.AvalonEdit.Editing
{
/// <summary>
/// Pin layer class. This class handles the pinning and unpinning operations.
/// </summary>
public class PinLayer : Layer, IWeakEventListener
{
private Canvas pinningSurface;
/// <summary>
/// PinLayer constructor.
/// </summary>
/// <param name="textArea">Text area for this layer.</param>
public PinLayer(TextArea textArea) : base(textArea.TextView, KnownLayer.Pins)
{
pinningSurface = new Canvas();
pinningSurface.Background = Brushes.Red;
pinningSurface.HorizontalAlignment = HorizontalAlignment.Stretch;
pinningSurface.VerticalAlignment = VerticalAlignment.Stretch;
TextViewWeakEventManager.VisualLinesChanged.AddListener(textArea.TextView, this);
}
bool IWeakEventListener.ReceiveWeakEvent(Type managerType, object sender, EventArgs e)
{
if (managerType == typeof(TextViewWeakEventManager.VisualLinesChanged))
{
pinningSurface.InvalidateVisual();
InvalidateVisual();
return true;
}
return false;
}
/// <summary>
/// Pins an element;
/// </summary>
/// <param name="element">Element to pin.</param>
public void Pin(Popup element)
{
if (element == null)
throw new NullReferenceException("Element is null!");
element.Placement = PlacementMode.Absolute;
pinningSurface.SetValue(Canvas.TopProperty, element.VerticalOffset);
pinningSurface.SetValue(Canvas.LeftProperty, element.HorizontalOffset);
pinningSurface.Children.Add(element);
}
/// <summary>
/// Unpins an element.
/// </summary>
/// <param name="element">Element to unpin.</param>
public void Unpin(Popup element)
{
if (element == null)
throw new NullReferenceException("Element is null!");
pinningSurface.Children.Remove(element);
}
}
}

7
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/TextArea.cs

@ -71,9 +71,16 @@ namespace ICSharpCode.AvalonEdit.Editing @@ -71,9 +71,16 @@ namespace ICSharpCode.AvalonEdit.Editing
this.DefaultInputHandler = new TextAreaDefaultInputHandler(this);
this.ActiveInputHandler = this.DefaultInputHandler;
PinningLayer = new PinLayer(this);
textView.InsertLayer(PinningLayer, KnownLayer.Caret, LayerInsertionPosition.Above);
}
#endregion
/// <summary>
/// Gets the pinning layer.
/// </summary>
public PinLayer PinningLayer { get; private set; }
#region InputHandler management
/// <summary>
/// Gets the default input handler.

1
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/ICSharpCode.AvalonEdit.csproj

@ -144,6 +144,7 @@ @@ -144,6 +144,7 @@
<Compile Include="Editing\DottedLineMargin.cs" />
<Compile Include="Editing\DragDropException.cs" />
<Compile Include="Editing\EditingCommandHandler.cs" />
<Compile Include="Editing\PinLayer.cs" />
<Compile Include="Folding\AbstractFoldingStrategy.cs" />
<Compile Include="Folding\FoldingElementGenerator.cs" />
<Compile Include="Folding\FoldingManager.cs" />

28
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/Layer.cs

@ -11,11 +11,23 @@ namespace ICSharpCode.AvalonEdit.Rendering @@ -11,11 +11,23 @@ namespace ICSharpCode.AvalonEdit.Rendering
/// <summary>
/// Base class for known layers.
/// </summary>
class Layer : UIElement
public class Layer : UIElement
{
/// <summary>
/// Text view.
/// </summary>
protected readonly TextView textView;
/// <summary>
/// Known layer.
/// </summary>
protected readonly KnownLayer knownLayer;
/// <summary>
/// Constructor for base layer class.
/// </summary>
/// <param name="textView">Text view</param>
/// <param name="knownLayer">Known layer.</param>
public Layer(TextView textView, KnownLayer knownLayer)
{
Debug.Assert(textView != null);
@ -24,16 +36,30 @@ namespace ICSharpCode.AvalonEdit.Rendering @@ -24,16 +36,30 @@ namespace ICSharpCode.AvalonEdit.Rendering
this.Focusable = false;
}
/// <summary>
/// HitTestCore method.
/// </summary>
/// <param name="hitTestParameters">Hit test parameters.</param>
/// <returns>A GeometryHitTestResult.</returns>
protected override GeometryHitTestResult HitTestCore(GeometryHitTestParameters hitTestParameters)
{
return null;
}
/// <summary>
/// HitTestCore method.
/// </summary>
/// <param name="hitTestParameters">Hit test parameters.</param>
/// <returns>A HitTestResult.</returns>
protected override HitTestResult HitTestCore(PointHitTestParameters hitTestParameters)
{
return null;
}
/// <summary>
/// Override for Render.
/// </summary>
/// <param name="drawingContext">Drawing context.</param>
protected override void OnRender(DrawingContext drawingContext)
{
base.OnRender(drawingContext);

6
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/LayerPosition.cs

@ -32,7 +32,11 @@ namespace ICSharpCode.AvalonEdit.Rendering @@ -32,7 +32,11 @@ namespace ICSharpCode.AvalonEdit.Rendering
/// This layer contains the blinking caret.
/// </summary>
/// <remarks>This layer is above the Text layer. All items on this layer will blink with the same frequency as the caret.</remarks>
Caret
Caret,
/// <summary>
/// This layer contains the data pins
/// </summary>
Pins
}
/// <summary>

7
src/Main/Base/Project/ICSharpCode.SharpDevelop.addin

@ -61,6 +61,13 @@ @@ -61,6 +61,13 @@
class = "ICSharpCode.SharpDevelop.BrowserDisplayBinding.BrowserDisplayBinding"/>
</Path>
<Path name="/SharpDevelop/Workbench/LanguageBindings">
<LanguageBinding
id="Pin"
class="Services.Debugger.Tooltips.PinningBinding"
extensions=".cs;.vb" />
</Path>
<Path name = "/SharpDevelop/Workbench/FileFilter">
<FileFilter id = "AllFiles"
name = "${res:SharpDevelop.FileFilter.AllFiles}"

4
src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj

@ -324,8 +324,10 @@ @@ -324,8 +324,10 @@
<Compile Include="Src\Services\Debugger\Tooltips\PinCloseControl.xaml.cs">
<DependentUpon>PinCloseControl.xaml</DependentUpon>
</Compile>
<Compile Include="Src\Services\Debugger\Tooltips\PinningBinding.cs" />
<Compile Include="Src\Services\Debugger\Tooltips\VirtualizingIEnumerable.cs" />
<Compile Include="Src\Services\Debugger\Tooltips\VisualizerPicker.cs" />
<Compile Include="Src\Services\Debugger\TreeNode.cs" />
<Compile Include="Src\Services\DisplayBinding\ExternalProcessDisplayBinding.cs" />
<Compile Include="Src\Services\DisplayBinding\ISecondaryDisplayBinding.cs" />
<Compile Include="Src\Services\DisplayBinding\ShellExecuteDisplayBinding.cs" />
@ -825,6 +827,8 @@ @@ -825,6 +827,8 @@
</ItemGroup>
<ItemGroup>
<Page Include="Src\Bookmarks\Pad\Controls\ListViewPad.xaml" />
<Page Include="Src\Services\Debugger\Tooltips\PinCloseControl.xaml" />
<Page Include="Src\Services\Debugger\Tooltips\PinControlsDictionary.xaml" />
<Page Include="Src\Services\RefactoringService\ContextActions\ContextActionsBulbControl.xaml" />
<Page Include="Src\Services\RefactoringService\ContextActions\ContextActionsControl.xaml" />
<Page Include="Src\Services\RefactoringService\ContextActions\ContextActionsHeaderedControl.xaml" />

55
src/Main/Base/Project/Src/Bookmarks/BookmarkConverter.cs

@ -5,9 +5,11 @@ using System; @@ -5,9 +5,11 @@ using System;
using System.ComponentModel;
using System.Globalization;
using System.Text;
using System.Windows;
using ICSharpCode.Core;
using ICSharpCode.NRefactory;
using Services.Debugger.Tooltips;
namespace ICSharpCode.SharpDevelop.Bookmarks
{
@ -34,7 +36,6 @@ namespace ICSharpCode.SharpDevelop.Bookmarks @@ -34,7 +36,6 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
return null;
if (columnNumber < 0)
return null;
SDBookmark bookmark;
switch (v[0]) {
case "Breakpoint":
@ -44,22 +45,33 @@ namespace ICSharpCode.SharpDevelop.Bookmarks @@ -44,22 +45,33 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
action = (Debugging.BreakpointAction)Enum.Parse(typeof(Debugging.BreakpointAction), v[5]);
scriptLanguage = v[6];
script = v[7];
var bbm = new Debugging.BreakpointBookmark(fileName, new Location(columnNumber, lineNumber), action, scriptLanguage, script);
bbm.IsEnabled = bool.Parse(v[4]);
bookmark = bbm;
bbm.Action = action;
bbm.ScriptLanguage = scriptLanguage;
bbm.Condition = script;
bookmark = bbm;
break;
case "PinBookmark":
var pin = new PinBookmark(fileName, new Location(columnNumber, lineNumber));
pin.Comment = v[4];
// pop-up position
pin.SavedPopupPosition =
new Point
{
X = int.Parse(v[5], culture),
Y = int.Parse(v[6], culture)
};
// pop-up nodes
pin.SavedNodes = new System.Collections.Generic.List<Tuple<string, string, string>>();
for (int i = 7; i < v.Length; i+=3) {
pin.SavedNodes.Add(new Tuple<string, string, string>(v[i], v[i+1], v[i+2]));
}
bookmark = pin;
break;
// case "PinBookmark":
// var pin = new PinBookmark(fileName, new Location(columnNumber, lineNumber));
// pin.Comment = v[3];
// for (int i = 4; i < v.Length; i+=2) {
// pin.SavedNodes.Add(new Tuple<string, string>(v[i], v[i+1]));
// }
//
// bookmark = pin;
// break;
default:
bookmark = new SDBookmark(fileName, new Location(columnNumber, lineNumber));
break;
@ -102,6 +114,27 @@ namespace ICSharpCode.SharpDevelop.Bookmarks @@ -102,6 +114,27 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
b.Append(bbm.Condition);
}
if (bookmark is PinBookmark) {
var pin = (PinBookmark)bookmark;
b.Append('|');
b.Append(pin.Comment ?? string.Empty);
// popup position
b.Append('|');
b.Append(pin.Popup.HorizontalOffset);
b.Append('|');
b.Append(pin.Popup.VerticalOffset);
b.Append('|');
//popup nodes
foreach(var node in pin.Nodes) {
b.Append("");
b.Append('|');
b.Append(node.Name);
b.Append('|');
b.Append(node.Text);
}
}
return b.ToString();
} else {
return base.ConvertTo(context, culture, value, destinationType);

55
src/Main/Base/Project/Src/Services/Debugger/Tooltips/DebuggerPopup.cs

@ -3,13 +3,11 @@ @@ -3,13 +3,11 @@
using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls.Primitives;
using System.Windows.Input;
using ICSharpCode.Core;
using ICSharpCode.AvalonEdit;
using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Gui;
using Services.Debugger.Tooltips;
namespace ICSharpCode.SharpDevelop.Debugging
{
@ -18,10 +16,13 @@ namespace ICSharpCode.SharpDevelop.Debugging @@ -18,10 +16,13 @@ namespace ICSharpCode.SharpDevelop.Debugging
/// </summary>
public class DebuggerPopup : Popup
{
private bool showPinControl;
internal DebuggerTooltipControl contentControl;
public DebuggerPopup(DebuggerTooltipControl parentControl, bool showPinControl)
{
this.showPinControl = showPinControl;
this.contentControl = new DebuggerTooltipControl(parentControl, showPinControl);
this.contentControl.containingPopup = this;
this.Child = this.contentControl;
@ -35,8 +36,6 @@ namespace ICSharpCode.SharpDevelop.Debugging @@ -35,8 +36,6 @@ namespace ICSharpCode.SharpDevelop.Debugging
//this.PopupAnimation = PopupAnimation.Slide;
}
public PinBookmark Mark { get; set; }
// attempt to propagate shortcuts to main windows when Popup is focusable (needed for keyboard scrolling + editing)
/*void DebuggerPopup_KeyDown(object sender, KeyEventArgs e)
{
@ -63,10 +62,9 @@ namespace ICSharpCode.SharpDevelop.Debugging @@ -63,10 +62,9 @@ namespace ICSharpCode.SharpDevelop.Debugging
return args.Handled;
}*/
public IEnumerable<ITreeNode> ItemsSource
public void SetItemsSource(IEnumerable<ITreeNode> value)
{
get { return this.contentControl.ItemsSource; }
set { this.contentControl.ItemsSource = value; }
this.contentControl.SetItemsSource(value);
}
private bool isLeaf;
@ -87,10 +85,31 @@ namespace ICSharpCode.SharpDevelop.Debugging @@ -87,10 +85,31 @@ namespace ICSharpCode.SharpDevelop.Debugging
if (isLeaf) {
this.contentControl.CloseOnLostFocus();
}
// unpin from surface
if (this.showPinControl) {
var provider = WorkbenchSingleton.Workbench.ActiveContent as ITextEditorProvider;
if(provider != null) {
var editor = (TextEditor)provider.TextEditor.GetService(typeof(TextEditor));
editor.TextArea.PinningLayer.Unpin(this);
}
}
}
public void Open()
{
if (this.IsOpen)
return;
// pin onto surface
if (this.showPinControl) {
var provider = WorkbenchSingleton.Workbench.ActiveContent as ITextEditorProvider;
if(provider != null) {
var editor = (TextEditor)provider.TextEditor.GetService(typeof(TextEditor));
editor.TextArea.PinningLayer.Pin(this);
}
}
this.IsOpen = true;
}
@ -99,5 +118,23 @@ namespace ICSharpCode.SharpDevelop.Debugging @@ -99,5 +118,23 @@ namespace ICSharpCode.SharpDevelop.Debugging
this.contentControl.CloseChildPopups();
this.IsOpen = false;
}
protected override void OnMouseEnter(System.Windows.Input.MouseEventArgs e)
{
if (showPinControl) {
Child.Opacity = 1d;
}
base.OnMouseEnter(e);
}
protected override void OnMouseLeave(System.Windows.Input.MouseEventArgs e)
{
if (showPinControl) {
Child.Opacity = DebuggerTooltipControl.MINIMUM_OPACITY;
}
base.OnMouseLeave(e);
}
}
}

684
src/Main/Base/Project/Src/Services/Debugger/Tooltips/DebuggerTooltipControl.xaml

@ -1,272 +1,426 @@ @@ -1,272 +1,426 @@
<UserControl x:Class="ICSharpCode.SharpDevelop.Debugging.DebuggerTooltipControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:aero="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"
xmlns:debugging="clr-namespace:ICSharpCode.SharpDevelop.Debugging"
xmlns:core="http://icsharpcode.net/sharpdevelop/core"
xmlns:localControls="clr-namespace:Services.Debugger.Tooltips"
Background="Transparent"
>
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="VisualizerPicker.xaml" />
<ResourceDictionary Source="PinControlsDictionary.xaml"/>
</ResourceDictionary.MergedDictionaries>
<!-- TODO move styles to ResourceDictionary -->
<Style x:Key="ExpandCollapseToggleStyle"
TargetType="{x:Type ToggleButton}">
<Setter Property="Focusable"
Value="False"/>
<Setter Property="Width"
Value="19"/>
<Setter Property="Height"
Value="13"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ToggleButton}">
<Border Width="19"
Height="13"
Background="Transparent">
<Border Width="9"
Height="9"
BorderThickness="1"
BorderBrush="#FF7898B5"
CornerRadius="1"
SnapsToDevicePixels="true">
<Border.Background>
<LinearGradientBrush StartPoint="0,0"
EndPoint="1,1">
<LinearGradientBrush.GradientStops>
<GradientStop Color="White"
Offset=".2"/>
<GradientStop Color="#FFC0B7A6"
Offset="1"/>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Border.Background>
<Path x:Name="ExpandPath"
Margin="1,1,1,1"
Fill="Black"
Data="M 0 2 L 0 3 L 2 3 L 2 5 L 3 5 L 3 3 L 5 3 L 5 2 L 3 2 L 3 0 L 2 0 L 2 2 Z"/>
</Border>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked"
Value="True">
<Setter Property="Data"
TargetName="ExpandPath"
Value="M 0 2 L 0 3 L 5 3 L 5 2 Z"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="upDownBorderStyle" TargetType="{x:Type Border}">
<Setter Property="BorderBrush" Value="Gray" />
<Setter Property="HorizontalAlignment" Value="Stretch" />
<Setter Property="Margin" Value="0" />
<Setter Property="Padding" Value="0" />
<Setter Property="Background" Value="#FFECF7FC" />
<Setter Property="Height" Value="14" />
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsEnabled}" Value="False">
<Setter Property="Background" Value="#FFE0E0E0"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
<Style x:Key="upButtonStyle" TargetType="{x:Type RepeatButton}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type RepeatButton}">
<Border Style="{StaticResource upDownBorderStyle}" BorderThickness="1 1 1 0">
<ContentPresenter HorizontalAlignment="Center"></ContentPresenter>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="downButtonStyle" TargetType="{x:Type RepeatButton}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type RepeatButton}">
<Border Style="{StaticResource upDownBorderStyle}" BorderThickness="1 0 1 1">
<ContentPresenter HorizontalAlignment="Center"></ContentPresenter>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="{x:Type TextBox}" x:Key="TextStyle">
<Setter Property="OverridesDefaultStyle" Value="True"/>
<Setter Property="VerticalAlignment" Value="Top"/>
<Setter Property="KeyboardNavigation.TabNavigation" Value="None"/>
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TextBoxBase}">
<Border
Name="Border"
Background="Transparent"
BorderBrush="Transparent"
BorderThickness="0">
<ScrollViewer Margin="0" Name="PART_ContentHost" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<?xml version="1.0" encoding="utf-8"?>
<UserControl
x:Class="ICSharpCode.SharpDevelop.Debugging.DebuggerTooltipControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:aero="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero" xmlns:debugging="clr-namespace:ICSharpCode.SharpDevelop.Debugging" xmlns:core="http://icsharpcode.net/sharpdevelop/core" xmlns:localControls="clr-namespace:Services.Debugger.Tooltips"
Background="Transparent">
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary
Source="VisualizerPicker.xaml" />
<ResourceDictionary
Source="PinControlsDictionary.xaml" />
</ResourceDictionary.MergedDictionaries>
<!-- TODO move styles to ResourceDictionary -->
<Style
x:Key="ExpandCollapseToggleStyle"
TargetType="{x:Type ToggleButton}">
<Setter
Property="Focusable"
Value="False" />
<Setter
Property="Width"
Value="19" />
<Setter
Property="Height"
Value="13" />
<Setter
Property="Template">
<Setter.Value>
<ControlTemplate
TargetType="{x:Type ToggleButton}">
<Border
Width="19"
Height="13"
Background="Transparent">
<Border
Width="9"
Height="9"
BorderThickness="1"
BorderBrush="#FF7898B5"
CornerRadius="1"
SnapsToDevicePixels="true">
<Border.Background>
<LinearGradientBrush
StartPoint="0,0"
EndPoint="1,1">
<LinearGradientBrush.GradientStops>
<GradientStop
Color="White"
Offset=".2" />
<GradientStop
Color="#FFC0B7A6"
Offset="1" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Border.Background>
<Path
x:Name="ExpandPath"
Margin="1,1,1,1"
Fill="Black"
Data="M 0 2 L 0 3 L 2 3 L 2 5 L 3 5 L 3 3 L 5 3 L 5 2 L 3 2 L 3 0 L 2 0 L 2 2 Z" />
</Border>
</Border>
<ControlTemplate.Triggers>
<Trigger
Property="IsChecked"
Value="True">
<Setter
Property="Data"
TargetName="ExpandPath"
Value="M 0 2 L 0 3 L 5 3 L 5 2 Z" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style
x:Key="upDownBorderStyle"
TargetType="{x:Type Border}">
<Setter
Property="BorderBrush"
Value="Gray" />
<Setter
Property="HorizontalAlignment"
Value="Stretch" />
<Setter
Property="Margin"
Value="0" />
<Setter
Property="Padding"
Value="0" />
<Setter
Property="Background"
Value="#FFECF7FC" />
<Setter
Property="Height"
Value="14" />
<Style.Triggers>
<DataTrigger
Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsEnabled}"
Value="False">
<Setter
Property="Background"
Value="#FFE0E0E0"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
<Style
x:Key="upButtonStyle"
TargetType="{x:Type RepeatButton}">
<Setter
Property="Template">
<Setter.Value>
<ControlTemplate
TargetType="{x:Type RepeatButton}">
<Border
Style="{StaticResource upDownBorderStyle}"
BorderThickness="1 1 1 0">
<ContentPresenter
HorizontalAlignment="Center"></ContentPresenter>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style
x:Key="downButtonStyle"
TargetType="{x:Type RepeatButton}">
<Setter
Property="Template">
<Setter.Value>
<ControlTemplate
TargetType="{x:Type RepeatButton}">
<Border
Style="{StaticResource upDownBorderStyle}"
BorderThickness="1 0 1 1">
<ContentPresenter
HorizontalAlignment="Center"></ContentPresenter>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style
TargetType="{x:Type TextBox}"
x:Key="TextStyle">
<Setter
Property="OverridesDefaultStyle"
Value="True" />
<Setter
Property="VerticalAlignment"
Value="Top" />
<Setter
Property="KeyboardNavigation.TabNavigation"
Value="None" />
<Setter
Property="FocusVisualStyle"
Value="{x:Null}" />
<Setter
Property="Template">
<Setter.Value>
<ControlTemplate
TargetType="{x:Type TextBoxBase}">
<Border
Name="Border"
Background="Transparent"
BorderBrush="Transparent"
BorderThickness="0">
<ScrollViewer
Margin="0"
Name="PART_ContentHost" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
</UserControl.Resources>
<Grid Background="Transparent" Name="ParentGrid">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="50"/>
</Grid.RowDefinitions>
<StackPanel Orientation="Vertical">
<RepeatButton Name="btnUp" Focusable="False" Style="{StaticResource upButtonStyle}" Content="^" Click="BtnUp_Click"></RepeatButton>
<DataGrid VerticalScrollBarVisibility="Disabled" HorizontalScrollBarVisibility="Disabled"
GridLinesVisibility="None"
RowHeight="18" MaxHeight="202"
SelectionMode="Single"
SelectionUnit="FullRow"
ItemsSource="{Binding}"
Name="dataGrid"
AutoGenerateColumns="False"
CanUserAddRows="False" HeadersVisibility="None"
BorderBrush="Gray"
BorderThickness="1">
<DataGrid.Background>
<!-- Control backgound -->
<LinearGradientBrush StartPoint="0,-0.03" EndPoint="0,1">
<GradientStop Color="White"/>
<GradientStop Color="#FFFAFCFE" Offset="0.983"/>
<GradientStop Color="#FFECF7FC" Offset="0.07"/>
<GradientStop Color="#FFEEF7FA" Offset="0.436"/>
</LinearGradientBrush>
</DataGrid.Background>
<DataGrid.RowStyle>
<Style TargetType="{x:Type DataGridRow}">
<Setter Property="Background" Value="Transparent"></Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#FFE2F6FE" />
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
<DataGrid.CellStyle>
<Style TargetType="{x:Type DataGridCell}">
<Setter Property="Focusable" Value="false" /> <!-- Focusable=true blocks shortcuts if cell is focused -->
<Setter Property="BorderThickness" Value="0" />
<Style.Triggers>
<Trigger Property="IsSelected" Value="True"> <!-- disable selection highlight -->
<Setter Property="Foreground" Value="Black" />
<Setter Property="Background" Value="{x:Null}" />
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.CellStyle>
<DataGrid.Columns>
<DataGridTemplateColumn> <!-- "Plus" expander -->
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid Background="White">
<StackPanel VerticalAlignment="Center">
<ToggleButton x:Name="btnExpander" Style="{StaticResource ExpandCollapseToggleStyle}" Click="btnExpander_Click" Padding="0" Margin="0" />
</StackPanel>
</Grid>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=HasChildNodes}" Value="False">
<Setter TargetName="btnExpander"
Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<!-- Icon -->
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image Source="{Binding ImageSource}"></Image>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn MinWidth="20" Header="Name"> <!-- Name -->
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Border BorderBrush="#FFDDDDDD" BorderThickness="0 0 1 0">
<TextBlock Margin="6 0" Text="{Binding Path=Name, Mode=OneWay}" VerticalAlignment="Top"></TextBlock>
</Border>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<!-- Visualizer picker -->
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<debugging:VisualizerPicker Focusable="False" x:Name="visPicker" ItemsSource="{Binding Path=VisualizerCommands, Mode=OneWay}" Margin="4 0 0 0"></debugging:VisualizerPicker>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=HasVisualizerCommands}" Value="False">
<Setter TargetName="visPicker" Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn MinWidth="20" Header="Text"> <!-- Text (value) -->
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox
Style="{StaticResource TextStyle}"
IsEnabled="{Binding CanSetText}"
KeyUp="TextBox_KeyUp"
Margin="4 0"
Text="{Binding Path=Text}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn> <!-- Pin -->
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ToggleButton
DataContext="{Binding}"
Visibility="Collapsed"
Name="PinButton"
VerticalAlignment="Center"
Checked="PinButton_Checked"
Unchecked="PinButton_Unchecked"
Template="{StaticResource PinTooltipButtonTemplate}"/>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=IsMouseOver, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGridRow}}" Value="True">
<Setter TargetName="PinButton" Property="Visibility" Value="Visible"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<Grid
Background="Transparent"
Name="ParentGrid">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition
Height="Auto" />
<RowDefinition
Height="50" />
</Grid.RowDefinitions>
<StackPanel
Orientation="Vertical">
<RepeatButton
Name="btnUp"
Focusable="False"
Style="{StaticResource upButtonStyle}"
Content="^"
Click="BtnUp_Click"></RepeatButton>
<DataGrid
VerticalScrollBarVisibility="Disabled"
HorizontalScrollBarVisibility="Disabled"
GridLinesVisibility="None"
RowHeight="18"
MaxHeight="202"
SelectionMode="Single"
SelectionUnit="FullRow"
ItemsSource="{Binding}"
Name="dataGrid"
AutoGenerateColumns="False"
CanUserAddRows="False"
HeadersVisibility="None"
BorderBrush="Gray"
BorderThickness="1">
<DataGrid.Background>
<!-- Control backgound -->
<LinearGradientBrush
StartPoint="0,-0.03"
EndPoint="0,1">
<GradientStop
Color="White" />
<GradientStop
Color="#FFFAFCFE"
Offset="0.983" />
<GradientStop
Color="#FFECF7FC"
Offset="0.07" />
<GradientStop
Color="#FFEEF7FA"
Offset="0.436" />
</LinearGradientBrush>
</DataGrid.Background>
<DataGrid.RowStyle>
<Style
TargetType="{x:Type DataGridRow}">
<Setter
Property="Background"
Value="Transparent"></Setter>
<Style.Triggers>
<Trigger
Property="IsMouseOver"
Value="True">
<Setter
Property="Background"
Value="#FFE2F6FE" />
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
<DataGrid.CellStyle>
<Style
TargetType="{x:Type DataGridCell}">
<Setter
Property="Focusable"
Value="false" />
<!-- Focusable=true blocks shortcuts if cell is focused -->
<Setter
Property="BorderThickness"
Value="0" />
<Style.Triggers>
<Trigger
Property="IsSelected"
Value="True">
<!-- disable selection highlight -->
<Setter
Property="Foreground"
Value="Black" />
<Setter
Property="Background"
Value="{x:Null}" />
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.CellStyle>
<DataGrid.Columns>
<DataGridTemplateColumn>
<!-- "Plus" expander -->
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid
Background="White">
<StackPanel
VerticalAlignment="Center">
<ToggleButton
x:Name="btnExpander"
Style="{StaticResource ExpandCollapseToggleStyle}"
Click="btnExpander_Click"
Padding="0"
Margin="0" />
</StackPanel>
</Grid>
<DataTemplate.Triggers>
<DataTrigger
Binding="{Binding Path=HasChildNodes}"
Value="False">
<Setter
TargetName="btnExpander"
Property="Visibility"
Value="Collapsed" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
<RepeatButton Name="btnDown" Focusable="False" Style="{StaticResource downButtonStyle}" Content="v" Click="BtnDown_Click"></RepeatButton>
<!-- commentTextbox -->
<Border Name="BorderComment" Background="White" BorderThickness="1,0,1,1" BorderBrush="Black" Height="0" MaxHeight="50">
<TextBox Name="CommentTextBox" Margin="3" Height="34" TextChanged="CommentTextBox_TextChanged"/>
<!-- Icon -->
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image
Source="{Binding ImageSource}"></Image>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn
MinWidth="20"
Header="Name">
<!-- Name -->
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Border
BorderBrush="#FFDDDDDD"
BorderThickness="0 0 1 0">
<TextBlock
Margin="6 0"
Text="{Binding Path=Name, Mode=OneWay}"
VerticalAlignment="Top"></TextBlock>
</Border>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<!-- Visualizer picker -->
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<debugging:VisualizerPicker
Focusable="False"
x:Name="visPicker"
ItemsSource="{Binding Path=VisualizerCommands, Mode=OneWay}"
Margin="4 0 0 0"></debugging:VisualizerPicker>
<DataTemplate.Triggers>
<DataTrigger
Binding="{Binding Path=HasVisualizerCommands}"
Value="False">
<Setter
TargetName="visPicker"
Property="Visibility"
Value="Collapsed" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn
MinWidth="20"
Header="Text">
<!-- Text (value) -->
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox
Style="{StaticResource TextStyle}"
IsEnabled="{Binding CanSetText}"
KeyUp="TextBox_KeyUp"
LostFocus="TextBox_LostFocus"
Margin="4 0"
Text="{Binding Path=Text}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn>
<!-- Pin -->
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ToggleButton
IsChecked="{Binding IsChecked}"
DataContext="{Binding}"
Visibility="Collapsed"
Name="PinButton"
VerticalAlignment="Center"
Checked="PinButton_Checked"
Unchecked="PinButton_Unchecked"
Template="{StaticResource PinTooltipButtonTemplate}" />
<DataTemplate.Triggers>
<DataTrigger
Binding="{Binding Path=IsMouseOver, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGridRow}}"
Value="True">
<Setter
TargetName="PinButton"
Property="Visibility"
Value="Visible" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
<RepeatButton
Name="btnDown"
Focusable="False"
Style="{StaticResource downButtonStyle}"
Content="v"
Click="BtnDown_Click"></RepeatButton>
<!-- commentTextbox -->
<Border
Name="BorderComment"
Background="White"
BorderThickness="1,0,1,1"
BorderBrush="Black"
Height="0"
MaxHeight="50">
<TextBox
Name="CommentTextBox"
TextChanged="CommentTextBox_TextChanged"
Margin="3"/>
</Border>
</StackPanel>
<Canvas MinWidth="25" Background="Transparent" Grid.Column="1" Name="PinControlCanvas" Visibility="Collapsed">
</StackPanel>
<Canvas
MinWidth="25"
Background="Transparent"
Grid.Column="1"
Name="PinControlCanvas"
Visibility="Collapsed">
<!-- Pin close control -->
</Canvas>
</Canvas>
</Grid>
</UserControl>

323
src/Main/Base/Project/Src/Services/Debugger/Tooltips/DebuggerTooltipControl.xaml.cs

@ -27,13 +27,15 @@ namespace ICSharpCode.SharpDevelop.Debugging @@ -27,13 +27,15 @@ namespace ICSharpCode.SharpDevelop.Debugging
/// </summary>
public partial class DebuggerTooltipControl : UserControl, ITooltip
{
public const double MINIMUM_OPACITY = .3d;
private readonly double ChildPopupOpenXOffet = 16;
private readonly double ChildPopupOpenYOffet = 15;
private readonly int InitialItemsCount = 12;
private readonly int VisibleItemsCount = 11;
private readonly ITextEditor editor;
bool showPinControl;
PinCloseControl pinCloseControl;
#region Contructors
public DebuggerTooltipControl(bool showPinControl = false)
{
@ -41,6 +43,10 @@ namespace ICSharpCode.SharpDevelop.Debugging @@ -41,6 +43,10 @@ namespace ICSharpCode.SharpDevelop.Debugging
this.showPinControl = showPinControl;
ITextEditorProvider provider = WorkbenchSingleton.Workbench.ActiveContent as ITextEditorProvider;
if (provider != null)
editor = provider.TextEditor;
// show pin close control
if (this.showPinControl) {
dataGrid.Columns[5].Visibility = Visibility.Collapsed;
@ -49,10 +55,13 @@ namespace ICSharpCode.SharpDevelop.Debugging @@ -49,10 +55,13 @@ namespace ICSharpCode.SharpDevelop.Debugging
pinCloseControl.Visibility = Visibility.Visible;
PinControlCanvas.Visibility = Visibility.Visible;
PinControlCanvas.Children.Add(pinCloseControl);
this.Opacity = MINIMUM_OPACITY;
}
else {
PinControlCanvas.Visibility = Visibility.Collapsed;
}
Loaded += new RoutedEventHandler(OnLoaded);
}
public DebuggerTooltipControl(ITreeNode node)
@ -63,7 +72,7 @@ namespace ICSharpCode.SharpDevelop.Debugging @@ -63,7 +72,7 @@ namespace ICSharpCode.SharpDevelop.Debugging
public DebuggerTooltipControl(IEnumerable<ITreeNode> nodes)
: this()
{
this.ItemsSource = nodes;
this.itemsSource = nodes;
}
public DebuggerTooltipControl(DebuggerTooltipControl parentControl, bool showPinControl = false)
@ -72,74 +81,114 @@ namespace ICSharpCode.SharpDevelop.Debugging @@ -72,74 +81,114 @@ namespace ICSharpCode.SharpDevelop.Debugging
this.parentControl = parentControl;
}
public event RoutedEventHandler Closed;
protected void OnClosed()
private void OnLoaded(object sender, RoutedEventArgs e)
{
if (this.Closed != null) {
this.Closed(this, new RoutedEventArgs());
// verify if at the line of the root there's a pin bookmark
var pin = BookmarkManager.Bookmarks.Find(
b => b is PinBookmark &&
b.Location.Line == LogicalPosition.Line &&
b.FileName == editor.FileName) as PinBookmark;
if (pin != null) {
foreach (var node in this.itemsSource) {
if (pin.ContainsNode(node))
node.IsChecked = true;
}
}
SetItemsSource(this.itemsSource);
}
private LazyItemsControl<ITreeNode> lazyGrid;
#endregion
private bool showPinControl;
internal PinCloseControl pinCloseControl;
private DebuggerPopup childPopup { get; set; }
private DebuggerTooltipControl parentControl { get; set; }
internal DebuggerPopup containingPopup { get; set; }
private LazyItemsControl<ITreeNode> lazyGrid;
private IEnumerable<ITreeNode> itemsSource;
public IEnumerable<ITreeNode> ItemsSource
public void SetItemsSource(IEnumerable<ITreeNode> value)
{
get { return this.itemsSource; }
set
{
this.itemsSource = value;
this.lazyGrid = new LazyItemsControl<ITreeNode>(this.dataGrid, InitialItemsCount);
lazyGrid.ItemsSource = new VirtualizingIEnumerable<ITreeNode>(value);
this.dataGrid.AddHandler(ScrollViewer.ScrollChangedEvent, new ScrollChangedEventHandler(handleScroll));
if (this.lazyGrid.ItemsSourceTotalCount != null) {
// hide up/down buttons if too few items
btnUp.Visibility = btnDown.Visibility =
this.lazyGrid.ItemsSourceTotalCount.Value <= VisibleItemsCount ? Visibility.Collapsed : Visibility.Visible;
}
this.itemsSource = value;
this.lazyGrid = new LazyItemsControl<ITreeNode>(this.dataGrid, InitialItemsCount);
lazyGrid.ItemsSource = new VirtualizingIEnumerable<ITreeNode>(value);
this.dataGrid.AddHandler(ScrollViewer.ScrollChangedEvent, new ScrollChangedEventHandler(handleScroll));
if (this.lazyGrid.ItemsSourceTotalCount != null) {
// hide up/down buttons if too few items
btnUp.Visibility = btnDown.Visibility =
this.lazyGrid.ItemsSourceTotalCount.Value <= VisibleItemsCount ? Visibility.Collapsed : Visibility.Visible;
}
}
/// <inheritdoc/>
public bool ShowAsPopup
public bool ShowAsPopup { get { return true; } }
/// <summary>
/// Position within the document
/// </summary>
public Location LogicalPosition { get; set; }
#region Expander
bool isChildExpanded
{
get
{
return true;
return this.childPopup != null && this.childPopup.IsOpen;
}
}
/// <summary>
/// Position within the document
/// </summary>
public Location LogicalPosition { get; set; }
private ToggleButton expandedButton;
/// <inheritdoc/>
public bool Close(bool mouseClick)
private void btnExpander_Click(object sender, RoutedEventArgs e)
{
if (mouseClick || (!mouseClick && !isChildExpanded)) {
var clickedButton = (ToggleButton)e.OriginalSource;
var clickedNode = (ITreeNode)clickedButton.DataContext;
// use device independent units, because child popup Left/Top are in independent units
Point buttonPos = clickedButton.PointToScreen(new Point(0, 0)).TransformFromDevice(clickedButton);
if (clickedButton.IsChecked.GetValueOrDefault(false)) {
CloseChildPopups();
return true;
this.expandedButton = clickedButton;
// open child Popup
if (this.childPopup == null) {
this.childPopup = new DebuggerPopup(this, showPinControl);
this.childPopup.Placement = PlacementMode.Absolute;
this.childPopup.contentControl.LogicalPosition = LogicalPosition;
}
if (this.containingPopup != null) {
this.containingPopup.IsLeaf = false;
}
this.childPopup.IsLeaf = true;
this.childPopup.HorizontalOffset = buttonPos.X + ChildPopupOpenXOffet;
this.childPopup.VerticalOffset = buttonPos.Y + ChildPopupOpenYOffet;
this.childPopup.SetItemsSource(clickedNode.ChildNodes);
this.childPopup.Open();
} else {
return false;
CloseChildPopups();
}
}
DebuggerPopup childPopup { get; set; }
DebuggerTooltipControl parentControl { get; set; }
internal DebuggerPopup containingPopup { get; set; }
#endregion
bool isChildExpanded
#region Close
/// <inheritdoc/>
public bool Close(bool mouseClick)
{
get
{
return this.childPopup != null && this.childPopup.IsOpen;
if (mouseClick || (!mouseClick && !isChildExpanded)) {
CloseChildPopups();
return true;
} else {
return false;
}
}
private ToggleButton expandedButton;
/// <summary>
/// Closes the child popup of this control, if it exists.
/// </summary>
@ -177,36 +226,18 @@ namespace ICSharpCode.SharpDevelop.Debugging @@ -177,36 +226,18 @@ namespace ICSharpCode.SharpDevelop.Debugging
}
}
private void btnExpander_Click(object sender, RoutedEventArgs e)
public event RoutedEventHandler Closed;
protected void OnClosed()
{
var clickedButton = (ToggleButton)e.OriginalSource;
var clickedNode = (ITreeNode)clickedButton.DataContext;
// use device independent units, because child popup Left/Top are in independent units
Point buttonPos = clickedButton.PointToScreen(new Point(0, 0)).TransformFromDevice(clickedButton);
if (clickedButton.IsChecked.GetValueOrDefault(false)) {
CloseChildPopups();
this.expandedButton = clickedButton;
// open child Popup
if (this.childPopup == null) {
this.childPopup = new DebuggerPopup(this, showPinControl);
this.childPopup.Placement = PlacementMode.Absolute;
}
if (this.containingPopup != null) {
this.containingPopup.IsLeaf = false;
}
this.childPopup.contentControl.LogicalPosition = LogicalPosition;
this.childPopup.IsLeaf = true;
this.childPopup.HorizontalOffset = buttonPos.X + ChildPopupOpenXOffet;
this.childPopup.VerticalOffset = buttonPos.Y + ChildPopupOpenYOffet;
this.childPopup.ItemsSource = clickedNode.ChildNodes;
this.childPopup.Open();
} else {
CloseChildPopups();
if (this.Closed != null) {
this.Closed(this, new RoutedEventArgs());
}
}
#endregion
#region Scrolling
private void handleScroll(object sender, ScrollChangedEventArgs e)
{
btnUp.IsEnabled = !this.lazyGrid.IsScrolledToStart;
@ -223,6 +254,10 @@ namespace ICSharpCode.SharpDevelop.Debugging @@ -223,6 +254,10 @@ namespace ICSharpCode.SharpDevelop.Debugging
this.lazyGrid.ScrollViewer.ScrollDown(1);
}
#endregion
#region Edit value in tooltip
void TextBox_KeyUp(object sender, KeyEventArgs e)
{
if (e.Key == Key.Escape) {
@ -233,13 +268,21 @@ namespace ICSharpCode.SharpDevelop.Debugging @@ -233,13 +268,21 @@ namespace ICSharpCode.SharpDevelop.Debugging
if (e.Key == Key.Enter) {
dataGrid.Focus();
// set new value
var textBox = (TextBox)sender;
var textBox = (TextBox)e.OriginalSource;
var newValue = textBox.Text;
var node = ((FrameworkElement)sender).DataContext as ITreeNode;
SaveNewValue(node, textBox.Text);
}
}
void TextBox_LostFocus(object sender, RoutedEventArgs e)
{
var textBox = (TextBox)e.OriginalSource;
var newValue = textBox.Text;
var node = ((FrameworkElement)sender).DataContext as ITreeNode;
SaveNewValue(node, textBox.Text);
}
void SaveNewValue(ITreeNode node, string newValue)
{
if(node != null && node.SetText(newValue)) {
@ -253,82 +296,81 @@ namespace ICSharpCode.SharpDevelop.Debugging @@ -253,82 +296,81 @@ namespace ICSharpCode.SharpDevelop.Debugging
}
}
#endregion
#region Pining checked/unchecked
void PinButton_Checked(object sender, RoutedEventArgs e)
{
ITextEditorProvider provider = WorkbenchSingleton.Workbench.ActiveContent as ITextEditorProvider;
ToggleButton button = (ToggleButton)e.OriginalSource;
if (provider != null) {
ITextEditor editor = provider.TextEditor;
if (!string.IsNullOrEmpty(editor.FileName)) {
var location = LogicalPosition;
var pin = BookmarkManager.Bookmarks.Find(b => b is PinBookmark &&
b.FileName == editor.FileName &&
b.Location.Line == location.Line) as PinBookmark;
bool found = false;
if (pin == null) {
pin = new PinBookmark(editor.FileName, location);
}
else {
found = true;
}
var popup = pin.Popup;
if (!found) {
// TODO set the pin inside the code editor pinning surface
// show pinned DebuggerPopup
if (popup == null) {
popup = new DebuggerPopup(null, true);
}
popup.Mark = pin;
popup.Placement = PlacementMode.Absolute;
Rect rect = new Rect(this.DesiredSize);
var point = this.PointToScreen(rect.TopRight);
popup.HorizontalOffset = 650;
popup.StaysOpen = true;
popup.VerticalOffset = point.Y - 50;
pin.Popup = popup;
pin.Nodes.Add((ITreeNode)button.DataContext);
BookmarkManager.ToggleBookmark(
editor,
location.Line,
b => b is PinBookmark,
l => pin);
popup.Open();
}
else
{
popup = pin.Popup;
pin.Nodes.Add((ITreeNode)button.DataContext);
}
popup.ItemsSource = pin.Nodes;
var node = (ITreeNode)(((ToggleButton)(e.OriginalSource)).DataContext);
if (!string.IsNullOrEmpty(editor.FileName)) {
// verify if at the line of the root there's a pin bookmark
var pin = BookmarkManager.Bookmarks.Find(
b => b is PinBookmark &&
b.LineNumber == LogicalPosition.Line &&
b.FileName == editor.FileName) as PinBookmark;
if (pin == null) {
pin = new PinBookmark(editor.FileName, LogicalPosition);
// show pinned DebuggerPopup
pin.Popup = new DebuggerPopup(null, true);
pin.Popup.contentControl.LogicalPosition = LogicalPosition;
pin.Popup.contentControl.pinCloseControl.Mark = pin;
Rect rect = new Rect(this.DesiredSize);
var point = this.PointToScreen(rect.TopRight);
pin.Popup.HorizontalOffset = 650;
pin.Popup.VerticalOffset = point.Y - 50;
pin.SavedPopupPosition = new Point { X = pin.Popup.HorizontalOffset, Y = pin.Popup.VerticalOffset };
pin.Nodes.Add(node);
// actions
pin.Popup.Open();
BookmarkManager.AddMark(pin);
}
else
{
if (!pin.ContainsNode(node))
pin.Nodes.Add(node);
}
}
}
void PinButton_Unchecked(object sender, RoutedEventArgs e)
{
// remove from pinned DebuggerPopup
ITextEditorProvider provider = WorkbenchSingleton.Workbench.ActiveContent as ITextEditorProvider;
if (provider != null) {
ITextEditor editor = provider.TextEditor;
if (!string.IsNullOrEmpty(editor.FileName)) {
var pin = BookmarkManager.Bookmarks.Find(b => b is PinBookmark &&
b.FileName == editor.FileName &&
b.Location.Line == LogicalPosition.Line) as PinBookmark;
ToggleButton button = (ToggleButton)e.OriginalSource;
pin.Nodes.Remove((ITreeNode)button.DataContext);
pin.Popup.ItemsSource = pin.Nodes;
if (!string.IsNullOrEmpty(editor.FileName)) {
// remove from pinned DebuggerPopup
var pin = BookmarkManager.Bookmarks.Find(
b => b is PinBookmark &&
b.LineNumber == LogicalPosition.Line &&
b.FileName == editor.FileName) as PinBookmark;
if (pin == null) return;
ToggleButton button = (ToggleButton)e.OriginalSource;
pin.RemoveNode((ITreeNode)button.DataContext);
// remove if no more data pins are available
if (pin.Nodes.Count == 0) {
pin.Popup.CloseSelfAndChildren();
BookmarkManager.RemoveMark(pin);
}
}
}
#endregion
#region Comment
public event EventHandler CommentChanged;
public string Comment {
get { return CommentTextBox.Text; }
set { CommentTextBox.Text = value; }
}
public void ShowComment(bool show)
{
if(show && BorderComment.Height != 0)
@ -349,20 +391,17 @@ namespace ICSharpCode.SharpDevelop.Debugging @@ -349,20 +391,17 @@ namespace ICSharpCode.SharpDevelop.Debugging
board.Begin(this);
}
public string Comment {
get { return CommentTextBox.Text; }
set { CommentTextBox.Text = value; }
}
public event EventHandler CommentChanged;
void CommentTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
var handler = CommentChanged;
if(handler != null)
if (handler != null)
handler(this, EventArgs.Empty);
}
#endregion
#region Saved Adorner
class SavedAdorner : Adorner
{
public SavedAdorner(UIElement adornedElement) : base(adornedElement)
@ -407,5 +446,7 @@ namespace ICSharpCode.SharpDevelop.Debugging @@ -407,5 +446,7 @@ namespace ICSharpCode.SharpDevelop.Debugging
board.Begin(this);
}
}
#endregion
}
}

2
src/Main/Base/Project/Src/Services/Debugger/Tooltips/ITreeNode.cs

@ -30,6 +30,8 @@ namespace ICSharpCode.SharpDevelop.Debugging @@ -30,6 +30,8 @@ namespace ICSharpCode.SharpDevelop.Debugging
bool HasVisualizerCommands { get; }
bool IsChecked { get; set; }
bool SetText(string newValue);
}
}

54
src/Main/Base/Project/Src/Services/Debugger/Tooltips/PinBookmark.cs

@ -5,12 +5,14 @@ using System; @@ -5,12 +5,14 @@ using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Windows;
using ICSharpCode.Core;
using ICSharpCode.NRefactory;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Bookmarks;
using ICSharpCode.SharpDevelop.Debugging;
using ICSharpCode.SharpDevelop.Editor;
namespace Services.Debugger.Tooltips
{
@ -18,31 +20,32 @@ namespace Services.Debugger.Tooltips @@ -18,31 +20,32 @@ namespace Services.Debugger.Tooltips
{
string tooltip;
public event NotifyCollectionChangedEventHandler CollectionChanged;
public DebuggerPopup Popup { get; set; }
public static readonly IImage PinImage = new ResourceServiceImage("Bookmarks.Pin");
public PinBookmark(FileName fileName, Location location) : base(fileName, location)
{
Nodes = new ObservableCollection<ITreeNode>();
SavedNodes = new List<Tuple<string, string>>();
Nodes.CollectionChanged += new NotifyCollectionChangedEventHandler(Nodes_CollectionChanged);
IsVisibleInBookmarkPad = false;
}
//TODO this should not be here but onto pinning surface of the code editor
public DebuggerPopup Popup { get; set; }
void Nodes_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
var handler = CollectionChanged;
if (handler != null)
handler.Invoke(this, e);
if (e.Action == NotifyCollectionChangedAction.Add ||
e.Action == NotifyCollectionChangedAction.Remove)
Popup.contentControl.SetItemsSource(Nodes);
}
public Point SavedPopupPosition { get; set; }
public ObservableCollection<ITreeNode> Nodes { get; set; }
public List<Tuple<string, string>> SavedNodes { get; set; }
/// <summary>
/// Image, Name, Text
/// </summary>
public List<Tuple<string, string, string>> SavedNodes { get; set; }
public string Comment { get; set; }
@ -57,4 +60,37 @@ namespace Services.Debugger.Tooltips @@ -57,4 +60,37 @@ namespace Services.Debugger.Tooltips
set { tooltip = value; }
}
}
public static class PinBookmarkExtensions
{
public static bool ContainsNode(this PinBookmark mark, ITreeNode node)
{
if (mark == null)
throw new ArgumentNullException("mark is null");
if (node == null)
throw new ArgumentNullException("Node is null");
foreach (var currentNode in mark.Nodes) {
if (node.Name == currentNode.Name)
return true;
}
return false;
}
public static void RemoveNode(this PinBookmark mark, ITreeNode node)
{
if (mark == null)
throw new ArgumentNullException("mark is null");
if (node == null)
throw new ArgumentNullException("Node is null");
foreach (var currentNode in mark.Nodes) {
if (node.Name == currentNode.Name) {
mark.Nodes.Remove(currentNode);
return;
}
}
}
}
}

57
src/Main/Base/Project/Src/Services/Debugger/Tooltips/PinCloseControl.xaml.cs

@ -2,9 +2,15 @@ @@ -2,9 +2,15 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Specialized;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using ICSharpCode.SharpDevelop.Bookmarks;
using ICSharpCode.SharpDevelop.Debugging;
@ -13,21 +19,35 @@ using ICSharpCode.SharpDevelop.Gui; @@ -13,21 +19,35 @@ using ICSharpCode.SharpDevelop.Gui;
namespace Services.Debugger.Tooltips
{
/// <summary>
/// Interaction logic for PinCloseControl.xaml
/// </summary>
public partial class PinCloseControl : UserControl
{
readonly DebuggerTooltipControl control;
private readonly DebuggerTooltipControl toolTipControl;
public PinCloseControl(DebuggerTooltipControl control)
public PinBookmark Mark { get; set; }
public PinCloseControl(DebuggerTooltipControl parent)
{
Margin = new Thickness(5, 0, 0, 0);
InitializeComponent();
this.control = control;
this.control.CommentChanged += delegate { Mark.Comment = control.Comment; };
this.toolTipControl = parent;
DebuggerService.DebugStopped += new EventHandler(DebuggerService_DebugStopped);
DebuggerService.DebugStarted += new EventHandler(DebuggerService_DebugStarted);
this.toolTipControl.CommentChanged += delegate { Mark.Comment = this.toolTipControl.Comment; };
}
void DebuggerService_DebugStarted(object sender, EventArgs e)
{
//this.toolTipControl.containingPopup.Open();
}
private PinBookmark Mark {
get { return this.control.containingPopup.Mark; }
void DebuggerService_DebugStopped(object sender, EventArgs e)
{
this.toolTipControl.containingPopup.CloseSelfAndChildren();
}
void Unpin()
@ -38,18 +58,17 @@ namespace Services.Debugger.Tooltips @@ -38,18 +58,17 @@ namespace Services.Debugger.Tooltips
void CloseButton_Click(object sender, RoutedEventArgs e)
{
Unpin();
this.control.containingPopup.CloseSelfAndChildren();
this.toolTipControl.containingPopup.CloseSelfAndChildren();
}
void CommentButton_Checked(object sender, RoutedEventArgs e)
{
this.control.ShowComment(true);
this.toolTipControl.ShowComment(true);
}
void CommentButton_Unchecked(object sender, RoutedEventArgs e)
{
this.control.ShowComment(false);
this.toolTipControl.ShowComment(false);
}
void UnpinButton_Checked(object sender, RoutedEventArgs e)
@ -59,18 +78,10 @@ namespace Services.Debugger.Tooltips @@ -59,18 +78,10 @@ namespace Services.Debugger.Tooltips
void UnpinButton_Unchecked(object sender, RoutedEventArgs e)
{
ITextEditorProvider provider = WorkbenchSingleton.Workbench.ActiveContent as ITextEditorProvider;
if (provider != null) {
ITextEditor editor = provider.TextEditor;
if (!string.IsNullOrEmpty(editor.FileName)) {
BookmarkManager.ToggleBookmark(
editor,
Mark.Location.Line,
b => b.CanToggle && b is PinBookmark,
location => Mark);
}
}
if(BookmarkManager.Bookmarks.Contains(Mark))
BookmarkManager.RemoveMark(Mark);
BookmarkManager.AddMark(Mark);
}
}
}

86
src/Main/Base/Project/Src/Services/Debugger/Tooltips/PinningBinding.cs

@ -0,0 +1,86 @@ @@ -0,0 +1,86 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.ObjectModel;
using System.Windows;
using ICSharpCode.AvalonEdit;
using ICSharpCode.Core.Presentation;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Bookmarks;
using ICSharpCode.SharpDevelop.Debugging;
using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Gui;
namespace Services.Debugger.Tooltips
{
public class PinningBinding : DefaultLanguageBinding
{
ITextEditor _editor;
public PinningBinding()
{}
public override void Attach(ITextEditor editor)
{
if (editor == null)
return;
_editor = editor;
// load pins
var pins = BookmarkManager.Bookmarks.FindAll(
b => b is PinBookmark && b.FileName == _editor.FileName);
foreach (var bookmark in pins) {
var pin = (PinBookmark)bookmark;
pin.Popup = new DebuggerPopup(null, true);
pin.Popup.HorizontalOffset = pin.SavedPopupPosition.X;
pin.Popup.VerticalOffset = pin.SavedPopupPosition.Y;
pin.Popup.contentControl.pinCloseControl.Mark = pin;
var nodes = new ObservableCollection<ITreeNode>();
foreach (var tuple in pin.SavedNodes) {
var node = new TreeNode();
node.IconImage =
new ResourceServiceImage(
!string.IsNullOrEmpty(tuple.Item1) ? tuple.Item1 : "Icons.16x16.Field");
node.Name = tuple.Item2;
node.Text = tuple.Item3;
nodes.Add(node);
}
pin.SavedNodes.Clear();
pin.Popup.SetItemsSource(nodes);
pin.Nodes = nodes;
pin.Popup.Open();
}
base.Attach(editor);
}
public override void Detach()
{
// save pins
var pins = BookmarkManager.Bookmarks.FindAll(
b => b is PinBookmark && b.FileName == _editor.FileName);
foreach (var bookmark in pins) {
var pin = (PinBookmark)bookmark;
pin.SavedPopupPosition = new Point
{
X = pin.Popup.HorizontalOffset,
Y = pin.Popup.VerticalOffset
};
pin.Popup.CloseSelfAndChildren();
}
base.Detach();
}
}
}

123
src/Main/Base/Project/Src/Services/Debugger/TreeNode.cs

@ -0,0 +1,123 @@ @@ -0,0 +1,123 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the BSD license (for details please see \src\AddIns\Debugger\Debugger.AddIn\license.txt)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Windows.Media;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Debugging;
namespace ICSharpCode.SharpDevelop.Debugging
{
/// <summary>
/// A node in the variable tree.
/// The node is imutable.
/// </summary>
public class TreeNode: IComparable<TreeNode>, ITreeNode
{
IImage iconImage = null;
string name = string.Empty;
string text = string.Empty;
string type = string.Empty;
IEnumerable<TreeNode> childNodes = null;
/// <summary>
/// The image displayed for this node.
/// </summary>
public IImage IconImage {
get { return iconImage; }
set { iconImage = value; }
}
/// <summary>
/// System.Windows.Media.ImageSource version of <see cref="IconImage"/>.
/// </summary>
public ImageSource ImageSource {
get {
return iconImage == null ? null : iconImage.ImageSource;
}
}
/// <summary>
/// System.Drawing.Image version of <see cref="IconImage"/>.
/// </summary>
public Image Image {
get {
return iconImage == null ? null : iconImage.Bitmap;
}
}
public string Name {
get { return name; }
set { name = value; }
}
public virtual string Text
{
get { return text; }
set { text = value; }
}
public virtual string Type {
get { return type; }
protected set { type = value; }
}
public virtual IEnumerable<TreeNode> ChildNodes {
get { return childNodes; }
protected set { childNodes = value; }
}
IEnumerable<ITreeNode> ITreeNode.ChildNodes {
get { return childNodes; }
}
public virtual bool HasChildNodes {
get { return childNodes != null; }
}
public virtual bool CanSetText {
get { return false; }
}
public virtual IEnumerable<IVisualizerCommand> VisualizerCommands {
get {
return null;
}
}
public virtual bool HasVisualizerCommands {
get {
return (VisualizerCommands != null) && (VisualizerCommands.Count() > 0);
}
}
public bool IsChecked { get; set; }
public TreeNode()
{
}
public TreeNode(IImage iconImage, string name, string text, string type, IEnumerable<TreeNode> childNodes)
{
this.iconImage = iconImage;
this.name = name;
this.text = text;
this.type = type;
this.childNodes = childNodes;
}
public int CompareTo(TreeNode other)
{
return this.Name.CompareTo(other.Name);
}
public virtual bool SetText(string newValue) {
return false;
}
}
}
Loading…
Cancel
Save