Browse Source

Tooltip now shows the type of variables.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@73 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 21 years ago
parent
commit
661a64dd21
  1. 54
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextArea.cs
  2. 8
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextAreaMouseHandler.cs
  3. 4
      src/Main/Base/Project/Src/Dom/Implementations/AbstractClass.cs
  4. 28
      src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs
  5. 5
      src/Main/Base/Project/Src/Services/AmbienceService/AbstractAmbience.cs
  6. 96
      src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs

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

@ -55,6 +55,9 @@ namespace ICSharpCode.TextEditor @@ -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 @@ -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 @@ -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,7 +372,7 @@ namespace ICSharpCode.TextEditor @@ -349,7 +372,7 @@ namespace ICSharpCode.TextEditor
Console.WriteLine("Got exception : " + ex);
}
// clipRectangle.Intersect(updateMargin.DrawingPosition);
}
}
if (clipRectangle.Width <= 0 || clipRectangle.Height <= 0) {
return;
@ -671,10 +694,11 @@ namespace ICSharpCode.TextEditor @@ -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);
@ -738,7 +762,7 @@ namespace ICSharpCode.TextEditor @@ -738,7 +762,7 @@ namespace ICSharpCode.TextEditor
Invalidate(r);
}
#endregion
#endregion
public event KeyEventHandler KeyEventHandler;
public event DialogKeyProcessor DoProcessDialogKey;
}

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

@ -21,7 +21,6 @@ namespace ICSharpCode.TextEditor @@ -21,7 +21,6 @@ namespace ICSharpCode.TextEditor
/// </summary>
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 @@ -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 @@ -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 @@ -159,12 +157,10 @@ namespace ICSharpCode.TextEditor
List<TextMarker> 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) {

4
src/Main/Base/Project/Src/Dom/Implementations/AbstractClass.cs

@ -352,7 +352,7 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -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 @@ -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)

28
src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs

@ -138,7 +138,16 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -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 @@ -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 @@ -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<IClass> classes = cu.GetOuterClasses(caretLine, caretColumn);
foreach (IClass c2 in classes) {
@ -517,17 +525,17 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -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;
}
}

5
src/Main/Base/Project/Src/Services/AmbienceService/AbstractAmbience.cs

@ -13,10 +13,7 @@ namespace ICSharpCode.Core @@ -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 {

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

@ -13,6 +13,7 @@ using System.IO; @@ -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;
@ -290,7 +291,7 @@ namespace ICSharpCode.Core @@ -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",
@ -517,9 +518,6 @@ namespace ICSharpCode.Core @@ -517,9 +518,6 @@ namespace ICSharpCode.Core
}
}
static TextMarker variableMarker;
static IDocument variableMarkerParent;
/// <summary>
/// This function shows variable values as tooltips
/// </summary>
@ -538,16 +536,16 @@ namespace ICSharpCode.Core @@ -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 @@ -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);
}
}
}
}

Loading…
Cancel
Save