Browse Source

Fixed SD2-574: tooltip delay (using system setting for MouseHoverTime)

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@909 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 20 years ago
parent
commit
e54926242a
  1. 1
      src/Libraries/ICSharpCode.TextEditor/Project/ICSharpCode.TextEditor.csproj
  2. 98
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextArea.cs
  3. 74
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextAreaMouseHandler.cs
  4. 65
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/ToolTipRequestEventArgs.cs
  5. 105
      src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs

1
src/Libraries/ICSharpCode.TextEditor/Project/ICSharpCode.TextEditor.csproj

@ -184,6 +184,7 @@
<Compile Include="Src\Util\FileReader.cs" /> <Compile Include="Src\Util\FileReader.cs" />
<EmbeddedResource Include="Resources\Boo.xshd" /> <EmbeddedResource Include="Resources\Boo.xshd" />
<Compile Include="Src\Gui\DrawableLine.cs" /> <Compile Include="Src\Gui\DrawableLine.cs" />
<Compile Include="Src\Gui\ToolTipRequestEventArgs.cs" />
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" /> <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
</Project> </Project>

98
src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextArea.cs

@ -296,12 +296,15 @@ namespace ICSharpCode.TextEditor
lastMouseInMargin.HandleMouseLeave(EventArgs.Empty); lastMouseInMargin.HandleMouseLeave(EventArgs.Empty);
lastMouseInMargin = null; lastMouseInMargin = null;
} }
CloseToolTip();
} }
protected override void OnMouseDown(System.Windows.Forms.MouseEventArgs e) protected override void OnMouseDown(System.Windows.Forms.MouseEventArgs e)
{ {
base.OnMouseDown(e); base.OnMouseDown(e);
CloseToolTip();
foreach (AbstractMargin margin in leftMargins) { foreach (AbstractMargin margin in leftMargins) {
if (margin.DrawingPosition.Contains(e.X, e.Y)) { if (margin.DrawingPosition.Contains(e.X, e.Y)) {
margin.HandleMouseDown(new Point(e.X, e.Y), e.Button); margin.HandleMouseDown(new Point(e.X, e.Y), e.Button);
@ -314,23 +317,11 @@ namespace ICSharpCode.TextEditor
// tooltips of text areas from inactive tabs floating around. // tooltips of text areas from inactive tabs floating around.
static DeclarationViewWindow toolTip; static DeclarationViewWindow toolTip;
static string oldToolTip; static string oldToolTip;
bool toolTipSet;
public bool ToolTipVisible {
get {
return toolTipSet;
}
}
public void SetToolTip(string text) void SetToolTip(string text, int lineNumber)
{ {
SetToolTip(text, -1); if (toolTip == null || toolTip.IsDisposed)
} toolTip = new DeclarationViewWindow(this.FindForm());
public void SetToolTip(string text, int lineNumber)
{
if (toolTip == null || toolTip.IsDisposed) toolTip = new DeclarationViewWindow(this.FindForm());
toolTipSet = (text != null);
if (oldToolTip == text) if (oldToolTip == text)
return; return;
if (text == null) { if (text == null) {
@ -351,12 +342,79 @@ namespace ICSharpCode.TextEditor
oldToolTip = text; oldToolTip = text;
} }
protected override void OnMouseMove(System.Windows.Forms.MouseEventArgs e) public event ToolTipRequestEventHandler ToolTipRequest;
protected virtual void OnToolTipRequest(ToolTipRequestEventArgs e)
{
if (ToolTipRequest != null) {
ToolTipRequest(this, e);
}
}
bool toolTipActive;
/// <summary>
/// Rectangle in text area that caused the current tool tip.
/// Prevents tooltip from re-showing when it was closed because of a click or keyboard
/// input and the mouse was not used.
/// </summary>
Rectangle toolTipRectangle;
void CloseToolTip()
{
if (toolTipActive) {
//Console.WriteLine("Closing tooltip");
toolTipActive = false;
SetToolTip(null, -1);
}
ResetMouseEventArgs();
}
protected override void OnMouseHover(EventArgs e)
{
base.OnMouseHover(e);
//Console.WriteLine("Hover raised at " + PointToClient(Control.MousePosition));
if (MouseButtons == MouseButtons.None) {
RequestToolTip(PointToClient(Control.MousePosition));
} else {
CloseToolTip();
}
}
protected void RequestToolTip(Point mousePos)
{
if (toolTipRectangle.Contains(mousePos)) {
if (!toolTipActive)
ResetMouseEventArgs();
return;
}
//Console.WriteLine("Request tooltip for " + mousePos);
toolTipRectangle = new Rectangle(mousePos.X - 4, mousePos.Y - 4, 8, 8);
Point logicPos = textView.GetLogicalPosition(mousePos.X - textView.DrawingPosition.Left,
mousePos.Y - textView.DrawingPosition.Top);
bool inDocument = textView.DrawingPosition.Contains(mousePos)
&& logicPos.Y >= 0 && logicPos.Y < Document.TotalNumberOfLines;
ToolTipRequestEventArgs args = new ToolTipRequestEventArgs(mousePos, logicPos, inDocument);
OnToolTipRequest(args);
if (args.ToolTipShown) {
//Console.WriteLine("Set tooltip to " + args.toolTipText);
toolTipActive = true;
SetToolTip(args.toolTipText, inDocument ? logicPos.Y + 1 : -1);
} else {
CloseToolTip();
}
}
protected override void OnMouseMove(MouseEventArgs e)
{ {
toolTipSet = false;
base.OnMouseMove(e); base.OnMouseMove(e);
if (!toolTipSet) if (!toolTipRectangle.Contains(e.Location)) {
SetToolTip(null); toolTipRectangle = Rectangle.Empty;
if (toolTipActive)
RequestToolTip(e.Location);
}
foreach (AbstractMargin margin in leftMargins) { foreach (AbstractMargin margin in leftMargins) {
if (margin.DrawingPosition.Contains(e.X, e.Y)) { if (margin.DrawingPosition.Contains(e.X, e.Y)) {
this.Cursor = margin.Cursor; this.Cursor = margin.Cursor;
@ -500,7 +558,7 @@ namespace ICSharpCode.TextEditor
HiddenMouseCursor = true; HiddenMouseCursor = true;
Cursor.Hide(); Cursor.Hide();
} }
SetToolTip(null); CloseToolTip();
motherTextEditorControl.BeginUpdate(); motherTextEditorControl.BeginUpdate();
// INSERT char // INSERT char

74
src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextAreaMouseHandler.cs

@ -53,6 +53,45 @@ namespace ICSharpCode.TextEditor
textArea.MouseLeave += new EventHandler(OnMouseLeave); textArea.MouseLeave += new EventHandler(OnMouseLeave);
textArea.MouseUp += new MouseEventHandler(OnMouseUp); textArea.MouseUp += new MouseEventHandler(OnMouseUp);
textArea.LostFocus += new EventHandler(TextAreaLostFocus); textArea.LostFocus += new EventHandler(TextAreaLostFocus);
textArea.ToolTipRequest += new ToolTipRequestEventHandler(OnToolTipRequest);
}
void OnToolTipRequest(object sender, ToolTipRequestEventArgs e)
{
if (e.ToolTipShown)
return;
Point mousepos = e.MousePosition;
FoldMarker marker = textArea.TextView.GetFoldMarkerFromPosition(mousepos.X - textArea.TextView.DrawingPosition.X,
mousepos.Y - textArea.TextView.DrawingPosition.Y);
if (marker != null && marker.IsFolded) {
StringBuilder sb = new StringBuilder(marker.InnerText);
// max 10 lines
int endLines = 0;
for (int i = 0; i < sb.Length; ++i) {
if (sb[i] == '\n') {
++endLines;
if (endLines >= 10) {
sb.Remove(i + 1, sb.Length - i - 1);
sb.Append(Environment.NewLine);
sb.Append("...");
break;
}
}
}
sb.Replace("\t", " ");
e.ShowToolTip(sb.ToString());
return;
}
List<TextMarker> markers = textArea.Document.MarkerStrategy.GetMarkers(e.LogicalPosition);
foreach (TextMarker tm in markers) {
if (tm.ToolTip != null) {
e.ShowToolTip(tm.ToolTip.Replace("\t", " "));
return;
}
}
} }
void ShowHiddenCursor() void ShowHiddenCursor()
@ -127,41 +166,6 @@ namespace ICSharpCode.TextEditor
return; return;
} }
if (e.Button == MouseButtons.None && !textArea.ToolTipVisible) {
FoldMarker marker = textArea.TextView.GetFoldMarkerFromPosition(mousepos.X - textArea.TextView.DrawingPosition.X,
mousepos.Y - textArea.TextView.DrawingPosition.Y);
if (marker != null && marker.IsFolded) {
StringBuilder sb = new StringBuilder(marker.InnerText);
// max 10 lines
int endLines = 0;
for (int i = 0; i < sb.Length; ++i) {
if (sb[i] == '\n') {
++endLines;
if (endLines >= 10) {
sb.Remove(i + 1, sb.Length - i - 1);
sb.Append(Environment.NewLine);
sb.Append("...");
break;
}
}
}
sb.Replace("\t", " ");
textArea.SetToolTip(sb.ToString());
return;
}
Point clickPosition2 = textArea.TextView.GetLogicalPosition(mousepos.X - textArea.TextView.DrawingPosition.X,
mousepos.Y - textArea.TextView.DrawingPosition.Y);
List<TextMarker> markers = textArea.Document.MarkerStrategy.GetMarkers(clickPosition2);
foreach (TextMarker tm in markers) {
if (tm.ToolTip != null) {
textArea.SetToolTip(tm.ToolTip.Replace("\t", " "));
return;
}
}
}
if (e.Button == MouseButtons.Left) { if (e.Button == MouseButtons.Left) {
if (gotmousedown) { if (gotmousedown) {

65
src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/ToolTipRequestEventArgs.cs

@ -0,0 +1,65 @@
/*
* Created by SharpDevelop.
* User: DG
* Date: 17.12.2005
* Time: 21:08
*
* To change this template use Tools | Options | Coding | Edit Standard Headers.
*/
using System;
using System.Drawing;
using System.Windows.Forms;
namespace ICSharpCode.TextEditor
{
public delegate void ToolTipRequestEventHandler(object sender, ToolTipRequestEventArgs e);
public class ToolTipRequestEventArgs
{
Point mousePosition;
Point logicalPosition;
bool inDocument;
public Point MousePosition {
get {
return mousePosition;
}
}
public Point LogicalPosition {
get {
return logicalPosition;
}
}
public bool InDocument {
get {
return inDocument;
}
}
/// <summary>
/// Gets if some client handling the event has already shown a tool tip.
/// </summary>
public bool ToolTipShown {
get {
return toolTipText != null;
}
}
internal string toolTipText;
public void ShowToolTip(string text)
{
toolTipText = text;
}
public ToolTipRequestEventArgs(Point mousePosition, Point logicalPosition, bool inDocument)
{
this.mousePosition = mousePosition;
this.logicalPosition = logicalPosition;
this.inDocument = inDocument;
}
}
}

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

@ -238,8 +238,8 @@ namespace ICSharpCode.Core
if (e.Content.Control is TextEditor.TextEditorControl) { if (e.Content.Control is TextEditor.TextEditorControl) {
TextArea textArea = ((TextEditor.TextEditorControl)e.Content.Control).ActiveTextAreaControl.TextArea; TextArea textArea = ((TextEditor.TextEditorControl)e.Content.Control).ActiveTextAreaControl.TextArea;
textArea.IconBarMargin.MouseDown += new MarginMouseEventHandler(IconBarMouseDown); textArea.IconBarMargin.MouseDown += IconBarMouseDown;
textArea.MouseMove += new MouseEventHandler(TextAreaMouseMove); textArea.ToolTipRequest += TextAreaToolTipRequest;
} }
} }
@ -248,8 +248,8 @@ namespace ICSharpCode.Core
if (e.Content.Control is TextEditor.TextEditorControl) { if (e.Content.Control is TextEditor.TextEditorControl) {
TextArea textArea = ((TextEditor.TextEditorControl)e.Content.Control).ActiveTextAreaControl.TextArea; TextArea textArea = ((TextEditor.TextEditorControl)e.Content.Control).ActiveTextAreaControl.TextArea;
textArea.IconBarMargin.MouseDown -= new MarginMouseEventHandler(IconBarMouseDown); textArea.IconBarMargin.MouseDown -= IconBarMouseDown;
textArea.MouseMove -= new MouseEventHandler(TextAreaMouseMove); textArea.ToolTipRequest -= TextAreaToolTipRequest;
} }
} }
@ -277,18 +277,16 @@ namespace ICSharpCode.Core
} }
#region Tool tips #region Tool tips
static string oldExpression, oldToolTip;
static DebuggerGridControl oldToolTipControl; static DebuggerGridControl oldToolTipControl;
static int oldLine;
/// <summary> /// <summary>
/// This function shows variable values as tooltips /// This function shows variable values as tooltips
/// </summary> /// </summary>
static void TextAreaMouseMove(object sender, MouseEventArgs args) static void TextAreaToolTipRequest(object sender, ToolTipRequestEventArgs e)
{ {
try { try {
TextArea textArea = (TextArea)sender; TextArea textArea = (TextArea)sender;
if (textArea.ToolTipVisible) return; if (e.ToolTipShown) return;
if (oldToolTipControl != null && !oldToolTipControl.AllowClose) return; if (oldToolTipControl != null && !oldToolTipControl.AllowClose) return;
if (!CodeCompletionOptions.TooltipsEnabled) return; if (!CodeCompletionOptions.TooltipsEnabled) return;
@ -297,64 +295,47 @@ namespace ICSharpCode.Core
if (!currentDebugger.IsDebugging) return; if (!currentDebugger.IsDebugging) return;
} }
Point mousepos = textArea.PointToClient(Control.MousePosition); if (e.InDocument) {
Rectangle viewRect = textArea.TextView.DrawingPosition; Point logicPos = e.LogicalPosition;
if (viewRect.Contains(mousepos)) { IDocument doc = textArea.Document;
Point logicPos = textArea.TextView.GetLogicalPosition(mousepos.X - viewRect.Left, IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(textArea.MotherTextEditorControl.FileName);
mousepos.Y - viewRect.Top); if (expressionFinder == null)
if (logicPos.Y >= 0 && logicPos.Y < textArea.Document.TotalNumberOfLines) { return;
IDocument doc = textArea.Document; LineSegment seg = doc.GetLineSegment(logicPos.Y);
IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(textArea.MotherTextEditorControl.FileName); if (logicPos.X > seg.Length - 1)
if (expressionFinder == null) return;
return; string textContent = doc.TextContent;
LineSegment seg = doc.GetLineSegment(logicPos.Y); ExpressionResult expressionResult = expressionFinder.FindFullExpression(textContent, seg.Offset + logicPos.X);
if (logicPos.X > seg.Length - 1) string expression = expressionResult.Expression;
return; if (expression != null && expression.Length > 0) {
string textContent = doc.TextContent; // Look if it is variable
ExpressionResult expressionResult = expressionFinder.FindFullExpression(textContent, seg.Offset + logicPos.X); ResolveResult result = ParserService.Resolve(expressionResult, logicPos.Y + 1, logicPos.X + 1, textArea.MotherTextEditorControl.FileName, textContent);
string expression = expressionResult.Expression; bool debuggerCanShowValue;
if (expression != null && expression.Length > 0) { string toolTipText = GetText(result, expression, out debuggerCanShowValue);
if (expression == oldExpression && oldLine == logicPos.Y) { DebuggerGridControl toolTipControl = null;
// same expression in same line -> reuse old tooltip if (toolTipText != null) {
if (oldToolTip != null) { if (Control.ModifierKeys == Keys.Control) {
textArea.SetToolTip(oldToolTip, oldLine + 1); toolTipText = "expr: " + expressionResult.ToString() + "\n" + toolTipText;
} } else if (debuggerCanShowValue && currentDebugger != null) {
// SetToolTip must be called in every mousemove event, toolTipControl = currentDebugger.GetTooltipControl(expressionResult.Expression);
// otherwise textArea will close the tooltip. toolTipText = null;
} else {
// 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);
DebuggerGridControl toolTipControl = null;
if (toolTipText != null) {
if (Control.ModifierKeys == Keys.Control) {
toolTipText = "expr: " + expressionResult.ToString() + "\n" + toolTipText;
} else if (debuggerCanShowValue && currentDebugger != null) {
toolTipControl = currentDebugger.GetTooltipControl(expressionResult.ToString().Replace("<","").Replace(">",""));
toolTipText = null;
}
}
if (toolTipText != null) {
textArea.SetToolTip(toolTipText, logicPos.Y + 1);
}
if (oldToolTipControl != null) {
Form frm = oldToolTipControl.FindForm();
if (frm != null) frm.Close();
}
if (toolTipControl != null) {
toolTipControl.ShowForm(textArea, logicPos);
}
oldToolTip = toolTipText;
oldToolTipControl = toolTipControl;
} }
} }
oldLine = logicPos.Y; if (toolTipText != null) {
oldExpression = expression; e.ShowToolTip(toolTipText);
}
if (oldToolTipControl != null) {
Form frm = oldToolTipControl.FindForm();
if (frm != null) frm.Close();
}
if (toolTipControl != null) {
toolTipControl.ShowForm(textArea, logicPos);
}
oldToolTipControl = toolTipControl;
} }
} }
} catch (Exception e) { } catch (Exception ex) {
ICSharpCode.Core.MessageService.ShowError(e); ICSharpCode.Core.MessageService.ShowError(ex);
} }
} }

Loading…
Cancel
Save