Browse Source

Applied "Providing text editor tooltips using the AddInTree" patch by Christian Hornung.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@1516 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 19 years ago
parent
commit
b00f016ce6
  1. 4
      AddIns/ICSharpCode.SharpDevelop.addin
  2. 1
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  3. 96
      src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs
  4. 74
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/ITextAreaToolTipProvider.cs

4
AddIns/ICSharpCode.SharpDevelop.addin

@ -1675,6 +1675,10 @@ @@ -1675,6 +1675,10 @@
class ="ICSharpCode.SharpDevelop.DefaultEditor.Commands.ShowBufferOptions"/>
</Path>
<Path name = "/SharpDevelop/ViewContent/DefaultTextEditor/ToolTips">
<Class id = "DefaultDebuggerToolTips" class = "ICSharpCode.Core.DebuggerTextAreaToolTipProvider"/>
</Path>
<Path name = "/SharpDevelop/Workbench/ToolBar/Standard">
<ToolbarItem id = "SearchSeparator" type = "Separator"/>
<Condition name = "WindowActive" activewindow="ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor.ITextEditorControlProvider" action="Disable">

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

@ -776,6 +776,7 @@ @@ -776,6 +776,7 @@
<Compile Include="Src\TextEditor\Gui\Editor\AdvancedHighlighter.cs" />
<Compile Include="Src\Dom\Implementations\SystemTypes.cs" />
<Compile Include="Src\Dom\CecilReader.cs" />
<Compile Include="Src\TextEditor\Gui\Editor\ITextAreaToolTipProvider.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\Libraries\DockPanel_Src\WinFormsUI\WinFormsUI.csproj">

96
src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs

@ -21,6 +21,8 @@ using System.Drawing; @@ -21,6 +21,8 @@ using System.Drawing;
using System.Windows.Forms;
using BM = ICSharpCode.SharpDevelop.Bookmarks;
using ITextEditorControlProvider = ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor.ITextEditorControlProvider;
using ITextAreaToolTipProvider = ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor.ITextAreaToolTipProvider;
using ToolTipInfo = ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor.ToolTipInfo;
namespace ICSharpCode.Core
{
@ -282,6 +284,8 @@ namespace ICSharpCode.Core @@ -282,6 +284,8 @@ namespace ICSharpCode.Core
}
#region Tool tips
const string ToolTipProviderAddInTreePath = "/SharpDevelop/ViewContent/DefaultTextEditor/ToolTips";
static DebuggerGridControl oldToolTipControl;
/// <summary>
@ -302,39 +306,28 @@ namespace ICSharpCode.Core @@ -302,39 +306,28 @@ namespace ICSharpCode.Core
}
if (e.InDocument) {
Point logicPos = e.LogicalPosition;
IDocument doc = textArea.Document;
IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(textArea.MotherTextEditorControl.FileName);
if (expressionFinder == null)
return;
LineSegment seg = doc.GetLineSegment(logicPos.Y);
if (logicPos.X > seg.Length - 1)
return;
string textContent = doc.TextContent;
ExpressionResult expressionResult = expressionFinder.FindFullExpression(textContent, seg.Offset + logicPos.X);
string expression = (expressionResult.Expression ?? "").Trim();
if (expression.Length > 0) {
// Look if it is variable
ResolveResult result = ParserService.Resolve(expressionResult, logicPos.Y + 1, logicPos.X + 1, textArea.MotherTextEditorControl.FileName, textContent);
bool debuggerCanShowValue;
string toolTipText = GetText(result, expression, out debuggerCanShowValue);
if (toolTipText != null) {
if (Control.ModifierKeys == Keys.Control) {
toolTipText = "expr: " + expressionResult.ToString() + "\n" + toolTipText;
} else if (debuggerCanShowValue && currentDebugger != null) {
toolTipControl = currentDebugger.GetTooltipControl(expressionResult.Expression);
toolTipText = null;
// Query all registered tooltip providers using the AddInTree.
// The first one that does not return null will be used.
ToolTipInfo ti = null;
foreach (ITextAreaToolTipProvider toolTipProvider in AddInTree.BuildItems<ITextAreaToolTipProvider>(ToolTipProviderAddInTreePath, null, false)) {
if ((ti = toolTipProvider.GetToolTipInfo(textArea, e)) != null) {
break;
}
}
if (toolTipText != null) {
e.ShowToolTip(toolTipText);
if (ti != null) {
toolTipControl = ti.ToolTipControl;
if (ti.ToolTipText != null) {
e.ShowToolTip(ti.ToolTipText);
}
}
CloseOldToolTip();
if (toolTipControl != null) {
toolTipControl.ShowForm(textArea, logicPos);
toolTipControl.ShowForm(textArea, e.LogicalPosition);
}
oldToolTipControl = toolTipControl;
}
}
} catch (Exception ex) {
ICSharpCode.Core.MessageService.ShowError(ex);
@ -365,6 +358,43 @@ namespace ICSharpCode.Core @@ -365,6 +358,43 @@ namespace ICSharpCode.Core
CloseOldToolTip();
}
/// <summary>
/// Gets debugger tooltip information for the specified position.
/// A descriptive text for the element or a DebuggerGridControl
/// showing its current value (when in debugging mode) can be returned
/// through the ToolTipInfo object.
/// Returns <c>null</c>, if no tooltip information is available.
/// </summary>
internal static ToolTipInfo GetToolTipInfo(TextArea textArea, ToolTipRequestEventArgs e)
{
Point logicPos = e.LogicalPosition;
IDocument doc = textArea.Document;
IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(textArea.MotherTextEditorControl.FileName);
if (expressionFinder == null)
return null;
LineSegment seg = doc.GetLineSegment(logicPos.Y);
if (logicPos.X > seg.Length - 1)
return null;
string textContent = doc.TextContent;
ExpressionResult expressionResult = expressionFinder.FindFullExpression(textContent, seg.Offset + logicPos.X);
string expression = (expressionResult.Expression ?? "").Trim();
if (expression.Length > 0) {
// Look if it is variable
ResolveResult result = ParserService.Resolve(expressionResult, logicPos.Y + 1, logicPos.X + 1, textArea.MotherTextEditorControl.FileName, textContent);
bool debuggerCanShowValue;
string toolTipText = GetText(result, expression, out debuggerCanShowValue);
if (toolTipText != null) {
if (Control.ModifierKeys == Keys.Control) {
toolTipText = "expr: " + expressionResult.ToString() + "\n" + toolTipText;
} else if (debuggerCanShowValue && currentDebugger != null) {
return new ToolTipInfo(currentDebugger.GetTooltipControl(expressionResult.Expression));
}
return new ToolTipInfo(toolTipText);
}
}
return null;
}
static string GetText(ResolveResult result, string expression, out bool debuggerCanShowValue)
{
debuggerCanShowValue = false;
@ -464,4 +494,18 @@ namespace ICSharpCode.Core @@ -464,4 +494,18 @@ namespace ICSharpCode.Core
}
#endregion
}
/// <summary>
/// Provides the default debugger tooltips on the text area.
/// </summary>
/// <remarks>
/// This class must be public because it is accessed via the AddInTree.
/// </remarks>
public class DebuggerTextAreaToolTipProvider : ITextAreaToolTipProvider
{
public ToolTipInfo GetToolTipInfo(TextArea textArea, ToolTipRequestEventArgs e)
{
return DebuggerService.GetToolTipInfo(textArea, e);
}
}
}

74
src/Main/Base/Project/Src/TextEditor/Gui/Editor/ITextAreaToolTipProvider.cs

@ -0,0 +1,74 @@ @@ -0,0 +1,74 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Christian Hornung" email="c-hornung@gmx.de"/>
// <version>$Revision$</version>
// </file>
using System;
using ICSharpCode.Core;
using ICSharpCode.TextEditor;
namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
{
/// <summary>
/// Describes an object being able to provide tooltip information for
/// the text editor.
/// </summary>
public interface ITextAreaToolTipProvider
{
/// <summary>
/// Gets tooltip information for the specified position in the text area,
/// if available.
/// </summary>
/// <returns><c>null</c>, if no tooltip information is available at this position, otherwise a ToolTipInfo object containing the tooltip information to be displayed.</returns>
ToolTipInfo GetToolTipInfo(TextArea textArea, ToolTipRequestEventArgs e);
}
/// <summary>
/// Contains information about a tooltip to be shown on the text area.
/// </summary>
public class ToolTipInfo
{
object toolTipObject;
/// <summary>
/// Gets the tool tip text to be displayed.
/// May be <c>null</c>.
/// </summary>
public string ToolTipText {
get {
return this.toolTipObject as string;
}
}
/// <summary>
/// Gets the DebuggerGridControl to be shown as tooltip.
/// May be <c>null</c>.
/// </summary>
public DebuggerGridControl ToolTipControl {
get {
return this.toolTipObject as DebuggerGridControl;
}
}
/// <summary>
/// Initializes a new instance of the <see cref="ToolTipInfo"/> class.
/// </summary>
/// <param name="toolTipText">The tooltip text to be displayed.</param>
public ToolTipInfo(string toolTipText)
{
this.toolTipObject = toolTipText;
}
/// <summary>
/// Initializes a new instance of the <see cref="ToolTipInfo"/> class.
/// </summary>
/// <param name="toolTipControl">The DebuggerGridControl to be shown as tooltip.</param>
public ToolTipInfo(DebuggerGridControl toolTipControl)
{
this.toolTipObject = toolTipControl;
}
}
}
Loading…
Cancel
Save