From 661a64dd21f529643a7b141315de30e1425b05e7 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 29 Jan 2005 23:23:59 +0000 Subject: [PATCH] Tooltip now shows the type of variables. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@73 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/Gui/TextArea.cs | 70 ++++--- .../Project/Src/Gui/TextAreaMouseHandler.cs | 8 +- .../Src/Dom/Implementations/AbstractClass.cs | 4 +- .../NRefactoryResolver/NRefactoryResolver.cs | 28 ++- .../AmbienceService/AbstractAmbience.cs | 5 +- .../Src/Services/Debugger/DebuggerService.cs | 182 ++++++++++-------- 6 files changed, 176 insertions(+), 121 deletions(-) diff --git a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextArea.cs b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextArea.cs index b4ef551874..386242ad55 100644 --- a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextArea.cs +++ b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextArea.cs @@ -55,6 +55,9 @@ namespace ICSharpCode.TextEditor SelectionManager selectionManager; Caret caret; + ToolTip toolTip = new ToolTip(); + bool toolTipSet = false; + public TextEditorControl MotherTextEditorControl { get { return motherTextEditorControl; @@ -226,18 +229,18 @@ namespace ICSharpCode.TextEditor } foreach (BracketHighlightingSheme bracketsheme in bracketshemes) { // if (bracketsheme.IsInside(textareapainter.Document, textareapainter.Document.Caret.Offset)) { - Highlight highlight = bracketsheme.GetHighlight(Document, Caret.Offset - 1); - if (textView.Highlight != null && textView.Highlight.OpenBrace.Y >=0 && textView.Highlight.OpenBrace.Y < Document.TotalNumberOfLines) { - UpdateLine(textView.Highlight.OpenBrace.Y); - } - if (textView.Highlight != null && textView.Highlight.CloseBrace.Y >=0 && textView.Highlight.CloseBrace.Y < Document.TotalNumberOfLines) { - UpdateLine(textView.Highlight.CloseBrace.Y); - } - textView.Highlight = highlight; - if (highlight != null) { - changed = true; - break; - } + Highlight highlight = bracketsheme.GetHighlight(Document, Caret.Offset - 1); + if (textView.Highlight != null && textView.Highlight.OpenBrace.Y >=0 && textView.Highlight.OpenBrace.Y < Document.TotalNumberOfLines) { + UpdateLine(textView.Highlight.OpenBrace.Y); + } + if (textView.Highlight != null && textView.Highlight.CloseBrace.Y >=0 && textView.Highlight.CloseBrace.Y < Document.TotalNumberOfLines) { + UpdateLine(textView.Highlight.CloseBrace.Y); + } + textView.Highlight = highlight; + if (highlight != null) { + changed = true; + break; + } // } } if (changed || textView.Highlight != null) { @@ -293,9 +296,29 @@ namespace ICSharpCode.TextEditor } } + string oldToolTip; + public void SetToolTip(string text) + { + if (oldToolTip == text) + return; + ToolTip toolTip = this.toolTip; + if (text == null) { + toolTip.Hide(this.FindForm()); + } else { + Point p = PointToClient(Control.MousePosition); + p.Offset(3, 3); + toolTip.Show(text, this, p); + toolTipSet = true; + } + oldToolTip = text; + } + protected override void OnMouseMove(System.Windows.Forms.MouseEventArgs e) { + toolTipSet = false; base.OnMouseMove(e); + if (!toolTipSet) + SetToolTip(null); foreach (AbstractMargin margin in leftMargins) { if (margin.DrawingPosition.Contains(e.X, e.Y)) { this.Cursor = margin.Cursor; @@ -349,8 +372,8 @@ namespace ICSharpCode.TextEditor Console.WriteLine("Got exception : " + ex); } // clipRectangle.Intersect(updateMargin.DrawingPosition); - } - + } + if (clipRectangle.Width <= 0 || clipRectangle.Height <= 0) { return; } @@ -512,7 +535,7 @@ namespace ICSharpCode.TextEditor Caret.UpdateCaretPosition(); } return true; - } + } return false; } @@ -671,10 +694,11 @@ namespace ICSharpCode.TextEditor base.Dispose(disposing); if (disposing) { Caret.Dispose(); + toolTip.Dispose(); } } -#region UPDATE Commands + #region UPDATE Commands internal void UpdateLine(int line) { UpdateLines(0, line, line); @@ -684,8 +708,8 @@ namespace ICSharpCode.TextEditor { UpdateLines(0, lineBegin, lineEnd); } - - internal void UpdateToEnd(int lineBegin) + + internal void UpdateToEnd(int lineBegin) { // if (lineBegin > FirstPhysicalLine + textView.VisibleLineCount) { // return; @@ -695,8 +719,8 @@ namespace ICSharpCode.TextEditor int y = Math.Max( 0, (int)(lineBegin * textView.FontHeight)); y = Math.Max(0, y - this.virtualTop.Y); Rectangle r = new Rectangle(0, - y, - Width, + y, + Width, Height - y); Invalidate(r); } @@ -732,13 +756,13 @@ namespace ICSharpCode.TextEditor int height = Math.Min(textView.DrawingPosition.Height, (int)((1 + lineEnd - lineBegin) * (textView.FontHeight + 1))); Rectangle r = new Rectangle(0, - y - 1 - this.virtualTop.Y, - Width, + y - 1 - this.virtualTop.Y, + Width, height + 3); Invalidate(r); } -#endregion + #endregion public event KeyEventHandler KeyEventHandler; public event DialogKeyProcessor DoProcessDialogKey; } diff --git a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextAreaMouseHandler.cs b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextAreaMouseHandler.cs index 0eedb4ea71..2e976670b7 100644 --- a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextAreaMouseHandler.cs +++ b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextAreaMouseHandler.cs @@ -21,7 +21,6 @@ namespace ICSharpCode.TextEditor /// public class TextAreaMouseHandler { - ToolTip toolTip = new ToolTip(); TextArea textArea; bool doubleclick = false; Point mousepos = new Point(0, 0); @@ -54,7 +53,6 @@ namespace ICSharpCode.TextEditor textArea.MouseLeave += new EventHandler(OnMouseLeave); textArea.MouseUp += new MouseEventHandler(OnMouseUp); textArea.LostFocus += new EventHandler(TextAreaLostFocus); - } void ShowHiddenCursor() @@ -150,7 +148,7 @@ namespace ICSharpCode.TextEditor } } sb.Replace("\t", " "); - toolTip.SetToolTip(textArea, sb.ToString()); + textArea.SetToolTip(sb.ToString()); return; } @@ -159,12 +157,10 @@ namespace ICSharpCode.TextEditor List markers = textArea.Document.MarkerStrategy.GetMarkers(clickPosition2); foreach (TextMarker tm in markers) { if (tm.ToolTip != null) { - toolTip.SetToolTip(textArea, tm.ToolTip.Replace("\t", " ")); + textArea.SetToolTip(tm.ToolTip.Replace("\t", " ")); return; } } - - toolTip.SetToolTip(textArea, null); } if (e.Button == MouseButtons.Left) { diff --git a/src/Main/Base/Project/Src/Dom/Implementations/AbstractClass.cs b/src/Main/Base/Project/Src/Dom/Implementations/AbstractClass.cs index c2fcdf918a..8e03eebf94 100644 --- a/src/Main/Base/Project/Src/Dom/Implementations/AbstractClass.cs +++ b/src/Main/Base/Project/Src/Dom/Implementations/AbstractClass.cs @@ -352,7 +352,7 @@ namespace ICSharpCode.SharpDevelop.Dom // enums must be handled specially, because there are several things defined we don't want to show // and enum members have neither the modifier nor the modifier public - if (ClassType == ClassType.Enum) { + /*if (ClassType == ClassType.Enum) { foreach (IField f in Fields) { if (f.IsLiteral) { members.Add(f); @@ -360,7 +360,7 @@ namespace ICSharpCode.SharpDevelop.Dom } members.AddRange(ProjectContent.GetClass("System.Enum").GetAccessibleMembers(callingClass, showStatic).ToArray()); return members; - } + }*/ bool isClassInInheritanceTree = false; if (callingClass != null) diff --git a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs index 5caf09ac13..18f7304aa7 100644 --- a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs +++ b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs @@ -138,7 +138,16 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver return new MemberResolveResult(callingClass, callingMember, method); } else if (expr is FieldReferenceExpression) { FieldReferenceExpression fieldReferenceExpression = (FieldReferenceExpression)expr; - IReturnType returnType = fieldReferenceExpression.TargetObject.AcceptVisitor(typeVisitor, null) as IReturnType; + IReturnType returnType; + if (fieldReferenceExpression.FieldName == null || fieldReferenceExpression.FieldName == "") { + if (fieldReferenceExpression.TargetObject is TypeReferenceExpression) { + returnType = new ReturnType(((TypeReferenceExpression)fieldReferenceExpression.TargetObject).TypeReference); + IClass c = projectContent.GetClass(returnType.FullyQualifiedName); + if (c != null) + return new TypeResolveResult(callingClass, callingMember, returnType, c); + } + } + returnType = fieldReferenceExpression.TargetObject.AcceptVisitor(typeVisitor, null) as IReturnType; if (returnType != null) { string name = SearchNamespace(returnType.FullyQualifiedName, this.CompilationUnit); if (name != null) { @@ -193,10 +202,6 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver if (name != null && name != "") { return new NamespaceResolveResult(callingClass, callingMember, name); } - IClass c = SearchType(identifier, this.CallingClass, this.CompilationUnit); - if (c != null) { - return new TypeResolveResult(callingClass, callingMember, new ReturnType(c.FullyQualifiedName), c); - } LocalLookupVariable var = SearchVariable(identifier); if (var != null) { IReturnType type = GetVariableType(var); @@ -208,16 +213,19 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver IField field = new LocalVariableField(para.ReturnType, para.Name, para.Region, callingClass); return new LocalResolveResult(callingClass, callingMember, field, true); } - IMember member = GetMember(callingClass, identifier); if (member != null) { return new MemberResolveResult(callingClass, callingMember, member); } - ResolveResult result = ResolveMethod(callingClass, identifier); if (result != null) return result; + IClass c = SearchType(identifier, this.CallingClass, cu); + if (c != null) { + return new TypeResolveResult(callingClass, callingMember, new ReturnType(c.FullyQualifiedName), c); + } + // try if there exists a static member in outer classes named typeName List classes = cu.GetOuterClasses(caretLine, caretColumn); foreach (IClass c2 in classes) { @@ -517,17 +525,17 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver isClassInInheritanceTree = callingClass.IsTypeInInheritanceTree(c); foreach (IClass curType in c.ClassInheritanceTree) { foreach (IProperty p in curType.Properties) { - if (IsSameName(p.Name, memberName) && p.MustBeShown(callingClass, true, isClassInInheritanceTree)) { + if (IsSameName(p.Name, memberName) && p.IsAccessible(callingClass, isClassInInheritanceTree)) { return p; } } foreach (IField f in curType.Fields) { - if (IsSameName(f.Name, memberName) && f.MustBeShown(callingClass, true, isClassInInheritanceTree)) { + if (IsSameName(f.Name, memberName) && f.IsAccessible(callingClass, isClassInInheritanceTree)) { return f; } } foreach (IEvent e in curType.Events) { - if (IsSameName(e.Name, memberName) && e.MustBeShown(callingClass, true, isClassInInheritanceTree)) { + if (IsSameName(e.Name, memberName) && e.IsAccessible(callingClass, isClassInInheritanceTree)) { return e; } } diff --git a/src/Main/Base/Project/Src/Services/AmbienceService/AbstractAmbience.cs b/src/Main/Base/Project/Src/Services/AmbienceService/AbstractAmbience.cs index 2d261a70a7..fb3397231c 100644 --- a/src/Main/Base/Project/Src/Services/AmbienceService/AbstractAmbience.cs +++ b/src/Main/Base/Project/Src/Services/AmbienceService/AbstractAmbience.cs @@ -13,10 +13,7 @@ namespace ICSharpCode.Core { public abstract class AbstractAmbience : IAmbience { - ConversionFlags conversionFlags = ConversionFlags.ShowParameterNames | - ConversionFlags.UseFullyQualifiedNames | - ConversionFlags.ShowInheritanceList | - ConversionFlags.ShowModifiers; + ConversionFlags conversionFlags = ConversionFlags.StandardConversionFlags; public ConversionFlags ConversionFlags { get { diff --git a/src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs b/src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs index 6566fc2138..e3f0c6c4ef 100644 --- a/src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs +++ b/src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs @@ -13,6 +13,7 @@ using System.IO; using ICSharpCode.Core; using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Project; using ICSharpCode.TextEditor.Document; using ICSharpCode.TextEditor; @@ -128,7 +129,7 @@ namespace ICSharpCode.Core if (debugger != null) { debugger.Stop(); } - + debugger.DebugStopped -= new EventHandler(HandleDebugStopped); debugger.Dispose(); @@ -195,7 +196,7 @@ namespace ICSharpCode.Core startInfo.UseShellExecute = false; StartWithoutDebugging(startInfo); } - + public static void Start(string fileName, string workingDirectory, string arguments) { if (IsProcessRuning) { @@ -235,7 +236,7 @@ namespace ICSharpCode.Core debugger.Continue(); } } - + public static void Step(bool stepInto) { IDebugger debugger = CurrentDebugger; @@ -280,7 +281,7 @@ namespace ICSharpCode.Core { standardProcess.Exited -= new EventHandler(StandardProcessExited); standardProcess.Dispose(); - standardProcess = null; + standardProcess = null; isRunning = false; } @@ -290,7 +291,7 @@ namespace ICSharpCode.Core // OnTextMessage(new TextMessageEventArgs("Got Exception\n")); // StopDebugger(); // } -// + // // protected override void OnProcessExited(ProcessEventArgs e) // { // OnTextMessage(new TextMessageEventArgs(String.Format("The program '[{1}] {0}' exited with code {2}.{3}\n", @@ -311,37 +312,37 @@ namespace ICSharpCode.Core public static event EventHandler BreakPointChanged; public static event EventHandler BreakPointAdded; public static event EventHandler BreakPointRemoved; - - static void OnBreakPointChanged(EventArgs e) + + static void OnBreakPointChanged(EventArgs e) { if (BreakPointChanged != null) { BreakPointChanged(null, e); } - } - - static void OnBreakPointAdded(EventArgs e) + } + + static void OnBreakPointAdded(EventArgs e) { if (BreakPointAdded != null) { BreakPointAdded(null, e); } - } - - static void OnBreakPointRemoved(EventArgs e) + } + + static void OnBreakPointRemoved(EventArgs e) { if (BreakPointRemoved != null) { BreakPointRemoved(null, e); } } - - + + static List breakpoints = new List(); - + public static IList Breakpoints { get { return breakpoints; } } - + public static void ToggleBreakpointAt(string fileName, int line, int column) { foreach(Breakpoint b in breakpoints) { @@ -354,38 +355,38 @@ namespace ICSharpCode.Core breakpoints.Add(new Breakpoint(fileName, line)); OnBreakPointAdded(EventArgs.Empty); } - - - - - - - + + + + + + + class BreakpointMarker: TextMarker - { + { public BreakpointMarker(int offset, int length, TextMarkerType textMarkerType, Color color, Color foreColor):base(offset, length, textMarkerType, color, foreColor) { } } - + class CurrentLineMarker: TextMarker - { + { public CurrentLineMarker(int offset, int length, TextMarkerType textMarkerType, Color color, Color foreColor):base(offset, length, textMarkerType, color, foreColor) { } } - + public static void InitializeService2() - { + { WorkbenchSingleton.WorkbenchCreated += new EventHandler(WorkspaceCreated); } - + static void WorkspaceCreated(object sender, EventArgs args) { WorkbenchSingleton.Workbench.ViewOpened += new ViewContentEventHandler(ViewContentOpened); WorkbenchSingleton.Workbench.ViewClosed += new ViewContentEventHandler(ViewContentClosed); } - + static void ViewContentOpened(object sender, ViewContentEventArgs e) { if (e.Content.Control is TextEditor.TextEditorControl) { @@ -409,8 +410,8 @@ namespace ICSharpCode.Core textArea.MouseMove -= new MouseEventHandler(TextAreaMouseMove); } } - - + + static TextMarker currentLineMarker; static IDocument currentLineMarkerParent; @@ -424,16 +425,16 @@ namespace ICSharpCode.Core currentLineMarker = null; } } - + static public void JumpToCurrentLine(string SourceFullFilename, int StartLine, int StartColumn, int EndLine, int EndColumn) { RemoveCurrentLineMarker(); - + FileService.OpenFile(SourceFullFilename); IWorkbenchWindow window = FileService.GetOpenFile(SourceFullFilename); if (window != null) { IViewContent content = window.ViewContent; - + if (content is IPositionable) { ((IPositionable)content).JumpTo((int)StartLine - 1, (int)StartColumn - 1); } @@ -450,9 +451,9 @@ namespace ICSharpCode.Core } } } - - - + + + static void IconBarMouseDown(AbstractMargin iconBar, Point mousepos, MouseButtons mouseButtons) { Rectangle viewRect = iconBar.TextArea.TextView.DrawingPosition; @@ -465,8 +466,8 @@ namespace ICSharpCode.Core } } - - static void RefreshBreakpointMarkersInEditor(TextEditorControl textEditor) + + static void RefreshBreakpointMarkersInEditor(TextEditorControl textEditor) { IDocument document = textEditor.Document; System.Collections.Generic.List markers = textEditor.Document.MarkerStrategy.TextMarker; @@ -489,7 +490,7 @@ namespace ICSharpCode.Core document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.WholeTextArea)); document.CommitUpdate(); } - + /// /// Draw Breakpoint icon and the yellow arrow in the margin /// @@ -504,7 +505,7 @@ namespace ICSharpCode.Core } } } - + foreach (TextMarker textMarker in iconBar.TextArea.Document.MarkerStrategy.TextMarker) { CurrentLineMarker currentLineMarker = textMarker as CurrentLineMarker; if (currentLineMarker != null) { @@ -516,15 +517,12 @@ namespace ICSharpCode.Core } } } - - static TextMarker variableMarker; - static IDocument variableMarkerParent; /// /// This function shows variable values as tooltips /// static void TextAreaMouseMove(object sender, MouseEventArgs args) - { + { TextArea textArea = (TextArea)sender; Point mousepos = textArea.PointToClient(Control.MousePosition); @@ -538,16 +536,16 @@ namespace ICSharpCode.Core string line = doc.GetText(seg.Offset, seg.Length); int startIndex = 0; int length = 0; - string expresion = String.Empty; + string expression = String.Empty; for(int index = 0; index < seg.Length; index++) { char chr = line[index]; if ((Char.IsLetterOrDigit(chr) || chr == '_' || chr == '.') == false || // invalid character - (chr == '.' && logicPos.X <= index)) { // Start of sub-expresion at the right side of cursor + (chr == '.' && logicPos.X <= index)) { // Start of sub-expression at the right side of cursor // End of expresion... if ((startIndex <= logicPos.X && logicPos.X <= index) && // Correct position - (startIndex != index)) { // Actualy something - length = index - startIndex; - expresion = line.Substring(startIndex, length); + (startIndex != index)) { // Actually something + length = index - startIndex; + expression = line.Substring(startIndex, length); break; } else { // Let's try next one... @@ -555,34 +553,66 @@ namespace ICSharpCode.Core } } } - //Console.WriteLine("MouseMove@" + logicPos + ":" + expresion); - if (variableMarker == null || variableMarker.Offset != (seg.Offset + startIndex) || variableMarker.Length != length) { - // Needs update - if (variableMarker != null) { - // Remove old marker - variableMarkerParent.MarkerStrategy.TextMarker.Remove(variableMarker); - variableMarkerParent.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.WholeTextArea)); - variableMarkerParent.CommitUpdate(); - variableMarkerParent = null; - variableMarker = null; - } - if (expresion != String.Empty) { - // Look if it is variable - try { - string value; - //value = selectedThread.LocalVariables[expresion].Value.ToString(); - value = expresion; - variableMarker = new TextMarker(seg.Offset + startIndex, length, TextMarkerType.Underlined, Color.Blue); - variableMarker.ToolTip = value; - variableMarkerParent = doc; - variableMarkerParent.MarkerStrategy.TextMarker.Add(variableMarker); - variableMarkerParent.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.WholeTextArea)); - variableMarkerParent.CommitUpdate(); - } catch {} + //Console.WriteLine("MouseMove@" + logicPos + ":" + expression); + if (expression != String.Empty) { + // Look if it is variable + try { + //value = selectedThread.LocalVariables[expresion].Value.ToString(); + ResolveResult result = ParserService.Resolve(expression, logicPos.Y, startIndex, textArea.MotherTextEditorControl.FileName, doc.TextContent); + string value = GetText(result); + if (value != null) { + textArea.SetToolTip(value); + } + } catch (Exception e) { + Console.Beep(); + Console.WriteLine(); + Console.WriteLine(e); } } } } } + + static string GetText(ResolveResult result) + { + if (result == null) + return null; + IAmbience ambience = AmbienceService.CurrentAmbience; + ambience.ConversionFlags = ConversionFlags.StandardConversionFlags + | ConversionFlags.ShowAccessibility; + if (result is MemberResolveResult) { + MemberResolveResult rr = (MemberResolveResult)result; + IMember member = rr.ResolvedMember; + if (member is IIndexer) + return ambience.Convert(member as IIndexer); + if (member is IField) + return ambience.Convert(member as IField); + if (member is IProperty) + return ambience.Convert(member as IProperty); + if (member is IEvent) + return ambience.Convert(member as IEvent); + if (member is IMethod) + return ambience.Convert(member as IMethod); + return "unknown member " + member.ToString(); + } else if (result is LocalResolveResult) { + LocalResolveResult rr = (LocalResolveResult)result; + ambience.ConversionFlags = ConversionFlags.UseFullyQualifiedNames + | ConversionFlags.ShowReturnType + | ConversionFlags.QualifiedNamesOnlyForReturnTypes; + if (rr.IsParameter) + return "parameter " + ambience.Convert(rr.Field); + else + return "local variable " + ambience.Convert(rr.Field); + } else if (result is NamespaceResolveResult) { + return "namespace " + ((NamespaceResolveResult)result).Name; + } else if (result is TypeResolveResult) { + return ambience.Convert(((TypeResolveResult)result).ResolvedClass); + } else { + if (result.ResolvedType == null) + return null; + else + return "expression of type " + ambience.Convert(result.ResolvedType); + } + } } }