Browse Source

Don't expose LinkElementGenerator.GetMatch().

pull/21/merge
Daniel Grunwald 14 years ago
parent
commit
821bb6e6e7
  1. 26
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/LinkElementGenerator.cs
  2. 5
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/VisualLineLinkText.cs
  3. 61
      src/Main/Base/Project/Src/Gui/Pads/CompilerMessageView/CompilerMessageView.cs
  4. 5
      src/Main/Base/Project/Src/Services/ParserService/Doozer/ProjectContentRegistryDescriptor.cs

26
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/LinkElementGenerator.cs

@ -57,7 +57,7 @@ namespace ICSharpCode.AvalonEdit.Rendering @@ -57,7 +57,7 @@ namespace ICSharpCode.AvalonEdit.Rendering
this.RequireControlModifierForClick = options.RequireControlModifierForHyperlinkClick;
}
protected Match GetMatch(int startOffset, out int matchOffset)
Match GetMatch(int startOffset, out int matchOffset)
{
int endOffset = CurrentContext.VisualLine.LastDocumentLine.EndOffset;
StringSegment relevantText = CurrentContext.GetText(startOffset, endOffset - startOffset);
@ -80,18 +80,28 @@ namespace ICSharpCode.AvalonEdit.Rendering @@ -80,18 +80,28 @@ namespace ICSharpCode.AvalonEdit.Rendering
int matchOffset;
Match m = GetMatch(offset, out matchOffset);
if (m.Success && matchOffset == offset) {
Uri uri = GetUriFromMatch(m);
if (uri == null)
return null;
VisualLineLinkText linkText = new VisualLineLinkText(CurrentContext.VisualLine, m.Length);
linkText.NavigateUri = uri;
linkText.RequireControlModifierForClick = this.RequireControlModifierForClick;
return linkText;
return ConstructElementFromMatch(m);
} else {
return null;
}
}
/// <summary>
/// Constructs a VisualLineElement that replaces the matched text.
/// The default implementation will create a <see cref="VisualLineLinkText"/>
/// based on the URI provided by <see cref="GetUriFromMatch"/>.
/// </summary>
protected virtual VisualLineElement ConstructElementFromMatch(Match m)
{
Uri uri = GetUriFromMatch(m);
if (uri == null)
return null;
VisualLineLinkText linkText = new VisualLineLinkText(CurrentContext.VisualLine, m.Length);
linkText.NavigateUri = uri;
linkText.RequireControlModifierForClick = this.RequireControlModifierForClick;
return linkText;
}
/// <summary>
/// Fetches the URI from the regex match. Returns null if the URI format is invalid.
/// </summary>

5
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Rendering/VisualLineLinkText.cs

@ -51,6 +51,11 @@ namespace ICSharpCode.AvalonEdit.Rendering @@ -51,6 +51,11 @@ namespace ICSharpCode.AvalonEdit.Rendering
return base.CreateTextRun(startVisualColumn, context);
}
/// <summary>
/// Gets whether the link is currently clickable.
/// </summary>
/// <remarks>Returns true when control is pressed; or when
/// <see cref="RequireControlModifierForClick"/> is disabled.</remarks>
protected bool LinkIsClickable()
{
if (NavigateUri == null)

61
src/Main/Base/Project/Src/Gui/Pads/CompilerMessageView/CompilerMessageView.cs

@ -49,16 +49,11 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -49,16 +49,11 @@ namespace ICSharpCode.SharpDevelop.Gui
}
#region MessageViewLinkElementGenerator
enum LinkType { CSharp, NUnit, Cpp }
class MessageViewLinkElementGenerator : LinkElementGenerator
{
LinkType type;
public MessageViewLinkElementGenerator(LinkType type)
: base(GetRegex(type))
public MessageViewLinkElementGenerator(Regex regex)
: base(regex)
{
this.type = type;
RequireControlModifierForClick = false;
}
@ -67,45 +62,31 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -67,45 +62,31 @@ namespace ICSharpCode.SharpDevelop.Gui
return new Uri(match.Groups[1].Value.Trim());
}
public override VisualLineElement ConstructElement(int offset)
protected override VisualLineElement ConstructElementFromMatch(Match m)
{
int matchOffset;
Match m = GetMatch(offset, out matchOffset);
if (m.Success && matchOffset == offset) {
Uri uri = GetUriFromMatch(m);
if (uri == null)
return null;
VisualLineMessageViewLinkText linkText = new VisualLineMessageViewLinkText(CurrentContext.VisualLine, m.Length);
linkText.NavigateUri = uri;
linkText.RequireControlModifierForClick = this.RequireControlModifierForClick;
linkText.Line = int.Parse(m.Groups[2].Value);
if (type == LinkType.CSharp)
linkText.Column = int.Parse(m.Groups[3].Value);
return linkText;
} else {
Uri uri = GetUriFromMatch(m);
if (uri == null)
return null;
}
}
static Regex GetRegex(LinkType type)
{
switch (type) {
case CompilerMessageView.LinkType.CSharp:
return new Regex(@"\b(\w:[/\\].*?)\((\d+),(\d+)\)");
case CompilerMessageView.LinkType.NUnit:
return new Regex(@"\b(\w:[/\\].*?):line\s(\d+)?\r?$");
case CompilerMessageView.LinkType.Cpp:
return new Regex(@"\b(\w:[/\\].*?)\((\d+)\)");
default:
throw new Exception("Invalid value for LinkType");
}
var linkText = new VisualLineMessageViewLinkText(CurrentContext.VisualLine, m.Length);
linkText.NavigateUri = uri;
linkText.RequireControlModifierForClick = this.RequireControlModifierForClick;
linkText.Line = int.Parse(m.Groups[2].Value);
if (m.Groups.Count > 3)
linkText.Column = int.Parse(m.Groups[3].Value);
return linkText;
}
public static void RegisterGenerators(TextView textView)
{
textView.ElementGenerators.Add(new MessageViewLinkElementGenerator(LinkType.CSharp));
textView.ElementGenerators.Add(new MessageViewLinkElementGenerator(LinkType.NUnit));
textView.ElementGenerators.Add(new MessageViewLinkElementGenerator(LinkType.Cpp));
// C#:
textView.ElementGenerators.Add(new MessageViewLinkElementGenerator(
new Regex(@"\b(\w:[/\\].*?)\((\d+),(\d+)\)")));
// NUnit:
textView.ElementGenerators.Add(new MessageViewLinkElementGenerator(
new Regex(@"\b(\w:[/\\].*?):line\s(\d+)?$")));
// C++:
textView.ElementGenerators.Add(new MessageViewLinkElementGenerator(
new Regex(@"\b(\w:[/\\].*?)\((\d+)\)")));
}
}

5
src/Main/Base/Project/Src/Services/ParserService/Doozer/ProjectContentRegistryDescriptor.cs

@ -29,6 +29,11 @@ namespace ICSharpCode.SharpDevelop @@ -29,6 +29,11 @@ namespace ICSharpCode.SharpDevelop
public bool UseRegistryForProject(IProject project)
{
// codon.GetFailedAction is obsolete, it doesn't consider inherited
// conditions. However, I don't care to fix this as inherited conditions
// aren't used with project content registries, and this code
// will be removed in SD5.
#pragma warning disable 618
return codon.GetFailedAction(project) == ConditionFailedAction.Nothing;
}

Loading…
Cancel
Save