Browse Source

add XmlDoc to Insight tooltips

newNR
Siegfried Pammer 12 years ago
parent
commit
4c0a1d18fe
  1. 4
      src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj
  2. 54
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpInsightItem.cs
  3. 48
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Utils/DocumentPrinter.cs
  4. 15
      src/Main/Base/Project/Editor/DocumentationUIBuilder.cs

4
src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj

@ -180,6 +180,10 @@ @@ -180,6 +180,10 @@
<Name>ICSharpCode.NRefactory.CSharp</Name>
<Private>False</Private>
</ProjectReference>
<ProjectReference Include="..\..\..\..\Libraries\NRefactory\ICSharpCode.NRefactory.Xml\ICSharpCode.NRefactory.Xml.csproj">
<Project>{DC393B66-92ED-4CAD-AB25-CFEF23F3D7C6}</Project>
<Name>ICSharpCode.NRefactory.Xml</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\..\Libraries\NRefactory\ICSharpCode.NRefactory\ICSharpCode.NRefactory.csproj">
<Project>{3B2A5653-EC97-4001-BB9B-D90F1AF2C371}</Project>
<Name>ICSharpCode.NRefactory</Name>

54
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpInsightItem.cs

@ -10,6 +10,8 @@ using System.Windows.Controls; @@ -10,6 +10,8 @@ using System.Windows.Controls;
using ICSharpCode.AvalonEdit.Highlighting;
using ICSharpCode.NRefactory.CSharp;
using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.NRefactory.Xml;
using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Editor.CodeCompletion;
namespace CSharpBinding.Completion
@ -23,13 +25,12 @@ namespace CSharpBinding.Completion @@ -23,13 +25,12 @@ namespace CSharpBinding.Completion
this.Method = method;
}
TextBlock header;
FlowDocumentScrollViewer header;
public object Header {
get {
if (header == null) {
header = new TextBlock();
GenerateHeader();
header = GenerateHeader();
}
return header;
}
@ -43,25 +44,56 @@ namespace CSharpBinding.Completion @@ -43,25 +44,56 @@ namespace CSharpBinding.Completion
return;
this.highlightedParameterIndex = parameterIndex;
if (header != null)
GenerateHeader();
header = GenerateHeader();
}
void GenerateHeader()
FlowDocumentScrollViewer GenerateHeader()
{
CSharpAmbience ambience = new CSharpAmbience();
ambience.ConversionFlags = ConversionFlags.StandardConversionFlags;
var stringBuilder = new StringBuilder();
var formatter = new ParameterHighlightingOutputFormatter(stringBuilder, highlightedParameterIndex);
ambience.ConvertEntity(Method, formatter, FormattingOptionsFactory.CreateSharpDevelop());
string code = stringBuilder.ToString();
var inlineBuilder = new RichTextModel();
inlineBuilder.SetFontWeight(formatter.parameterStartOffset, formatter.parameterLength, FontWeights.Bold);
header.Inlines.Clear();
header.Inlines.AddRange(new RichText(code, inlineBuilder).CreateRuns());
var documentation = XmlDocumentationElement.Get(Method);
ambience.ConversionFlags = ConversionFlags.ShowTypeParameterList;
DocumentationUIBuilder b = new DocumentationUIBuilder(ambience);
string parameterName = null;
if (Method.Parameters.Count > highlightedParameterIndex)
parameterName = Method.Parameters[highlightedParameterIndex].Name;
b.AddSignatureBlock(stringBuilder.ToString(), formatter.parameterStartOffset, formatter.parameterLength, parameterName);
DocumentationUIBuilder b2 = new DocumentationUIBuilder(ambience);
b2.ParameterName = parameterName;
b2.ShowAllParameters = false;
if (documentation != null) {
foreach (var child in documentation.Children) {
b2.AddDocumentationElement(child);
}
}
content = new FlowDocumentScrollViewer {
Document = b2.CreateFlowDocument(),
VerticalScrollBarVisibility = ScrollBarVisibility.Auto
};
return new FlowDocumentScrollViewer {
Document = b.CreateFlowDocument(),
VerticalScrollBarVisibility = ScrollBarVisibility.Auto
};
}
FlowDocumentScrollViewer content;
public object Content {
get { return null; }
get {
if (content == null) {
GenerateHeader();
}
return content;
}
}
sealed class ParameterHighlightingOutputFormatter : TextWriterTokenWriter

48
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Utils/DocumentPrinter.cs

@ -2,6 +2,7 @@ @@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Packaging;
using System.Printing;
@ -35,28 +36,18 @@ namespace ICSharpCode.AvalonEdit.Utils @@ -35,28 +36,18 @@ namespace ICSharpCode.AvalonEdit.Utils
}
/// <summary>
/// Converts a readonly TextDocument to a Block and applies the provided highlighter.
/// Converts an IDocument to a Block and applies the provided highlighter.
/// </summary>
public static Block ConvertTextDocumentToBlock(IDocument document, IHighlighter highlighter)
{
if (document == null)
throw new ArgumentNullException("document");
// Table table = new Table();
// table.Columns.Add(new TableColumn { Width = GridLength.Auto });
// table.Columns.Add(new TableColumn { Width = new GridLength(1, GridUnitType.Star) });
// TableRowGroup trg = new TableRowGroup();
// table.RowGroups.Add(trg);
Paragraph p = new Paragraph();
p.TextAlignment = TextAlignment.Left;
for (int lineNumber = 1; lineNumber <= document.LineCount; lineNumber++) {
if (lineNumber > 1)
p.Inlines.Add(new LineBreak());
var line = document.GetLineByNumber(lineNumber);
// TableRow row = new TableRow();
// trg.Rows.Add(row);
// row.Cells.Add(new TableCell(new Paragraph(new Run(lineNumber.ToString()))) { TextAlignment = TextAlignment.Right });
// Paragraph p = new Paragraph();
// row.Cells.Add(new TableCell(p));
if (highlighter != null) {
HighlightedLine highlightedLine = highlighter.HighlightLine(lineNumber);
p.Inlines.AddRange(highlightedLine.ToRichText().CreateRuns());
@ -67,6 +58,41 @@ namespace ICSharpCode.AvalonEdit.Utils @@ -67,6 +58,41 @@ namespace ICSharpCode.AvalonEdit.Utils
return p;
}
/// <summary>
/// Converts a readonly TextDocument to a RichText and applies the provided highlighting definition.
/// </summary>
public static RichText ConvertTextDocumentToRichText(ReadOnlyDocument document, IHighlightingDefinition highlightingDefinition)
{
IHighlighter highlighter;
if (highlightingDefinition != null)
highlighter = new DocumentHighlighter(document, highlightingDefinition);
else
highlighter = null;
return ConvertTextDocumentToRichText(document, highlighter);
}
/// <summary>
/// Converts an IDocument to a RichText and applies the provided highlighter.
/// </summary>
public static RichText ConvertTextDocumentToRichText(IDocument document, IHighlighter highlighter)
{
if (document == null)
throw new ArgumentNullException("document");
var texts = new List<RichText>();
for (int lineNumber = 1; lineNumber <= document.LineCount; lineNumber++) {
var line = document.GetLineByNumber(lineNumber);
if (lineNumber > 1)
texts.Add(line.PreviousLine.DelimiterLength == 2 ? "\r\n" : "\n");
if (highlighter != null) {
HighlightedLine highlightedLine = highlighter.HighlightLine(lineNumber);
texts.Add(highlightedLine.ToRichText());
} else {
texts.Add(document.GetText(line));
}
}
return RichText.Concat(texts.ToArray());
}
/// <summary>
/// Creates a flow document from the editor's contents.
/// </summary>

15
src/Main/Base/Project/Editor/DocumentationUIBuilder.cs

@ -214,6 +214,21 @@ namespace ICSharpCode.SharpDevelop.Editor @@ -214,6 +214,21 @@ namespace ICSharpCode.SharpDevelop.Editor
AddBlock(block);
}
public void AddSignatureBlock(string signature, int currentParameterOffset, int currentParameterLength, string currentParameterName)
{
ParameterName = currentParameterName;
var document = new ReadOnlyDocument(signature);
var highlightingDefinition = HighlightingManager.Instance.GetDefinition("C#");
var richText = DocumentPrinter.ConvertTextDocumentToRichText(document, highlightingDefinition).ToRichTextModel();
richText.SetFontWeight(currentParameterOffset, currentParameterLength, FontWeights.Bold);
var block = new Paragraph();
block.Inlines.AddRange(new RichText(signature, richText).CreateRuns()); // TODO richText.CreateRuns(document)
block.FontFamily = GetCodeFont();
block.TextAlignment = TextAlignment.Left;
AddBlock(block);
}
bool? ParseBool(string input)
{
bool result;

Loading…
Cancel
Save