You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
118 lines
3.8 KiB
118 lines
3.8 KiB
// <file> |
|
// <copyright see="prj:///doc/copyright.txt"/> |
|
// <license see="prj:///doc/license.txt"/> |
|
// <author name="Daniel Grunwald"/> |
|
// <version>$Revision$</version> |
|
// </file> |
|
|
|
using System; |
|
using System.IO; |
|
using System.Windows; |
|
using System.Windows.Controls; |
|
using System.Windows.Documents; |
|
using System.Windows.Media; |
|
using ICSharpCode.AvalonEdit.Document; |
|
using ICSharpCode.AvalonEdit.Highlighting; |
|
using ICSharpCode.Core; |
|
using ICSharpCode.SharpDevelop; |
|
using ICSharpCode.SharpDevelop.Editor; |
|
using ICSharpCode.SharpDevelop.Editor.Search; |
|
|
|
namespace SearchAndReplace |
|
{ |
|
/// <summary> |
|
/// Represents a search result. |
|
/// </summary> |
|
sealed class SearchResultNode : SearchNode |
|
{ |
|
static readonly FontFamily resultLineFamily = new FontFamily("Consolas, Courier New"); |
|
|
|
SearchResultMatch result; |
|
int lineNumber, column; |
|
HighlightedInlineBuilder inlineBuilder; |
|
|
|
public SearchResultNode(SearchResultMatch result) |
|
{ |
|
this.result = result; |
|
|
|
IDocument document = result.CreateDocument(); |
|
var startPosition = result.GetStartPosition(document); |
|
this.lineNumber = startPosition.Line; |
|
this.column = startPosition.Column; |
|
|
|
if (lineNumber >= 1 && lineNumber <= document.TotalNumberOfLines) { |
|
IDocumentLine matchedLine = document.GetLine(lineNumber); |
|
inlineBuilder = new HighlightedInlineBuilder(matchedLine.Text); |
|
inlineBuilder.SetFontFamily(0, inlineBuilder.Text.Length, resultLineFamily); |
|
|
|
DocumentHighlighter highlighter = document.GetService(typeof(DocumentHighlighter)) as DocumentHighlighter; |
|
TextDocument textDocument = document.GetService(typeof(TextDocument)) as TextDocument; |
|
if (highlighter != null && textDocument != null) { |
|
HighlightedLine highlightedLine = highlighter.HighlightLine(textDocument.GetLineByNumber(lineNumber)); |
|
int startOffset = highlightedLine.DocumentLine.Offset; |
|
// copy only the foreground color |
|
foreach (HighlightedSection section in highlightedLine.Sections) { |
|
if (section.Color.Foreground != null) { |
|
inlineBuilder.SetForeground(section.Offset - startOffset, section.Length, section.Color.Foreground.GetBrush(null)); |
|
} |
|
} |
|
} |
|
|
|
// now highlight the match in bold |
|
if (column >= 1) { |
|
var endPosition = result.GetEndPosition(document); |
|
if (endPosition.Line == startPosition.Line && endPosition.Column > startPosition.Column) { |
|
// subtract one from the column to get the offset inside the line's text |
|
int startOffset = column - 1; |
|
int endOffset = Math.Min(inlineBuilder.Text.Length, endPosition.Column - 1); |
|
inlineBuilder.SetFontWeight(startOffset, endOffset - startOffset, FontWeights.Bold); |
|
} |
|
} |
|
} |
|
} |
|
|
|
bool showFileName = true; |
|
|
|
public bool ShowFileName { |
|
get { |
|
return showFileName; |
|
} |
|
set { |
|
if (showFileName != value) { |
|
showFileName = value; |
|
InvalidateText(); |
|
} |
|
} |
|
} |
|
|
|
protected override object CreateText() |
|
{ |
|
LoggingService.Debug("Creating text for search result (" + lineNumber + ", " + column + ") "); |
|
|
|
TextBlock textBlock = new TextBlock(); |
|
textBlock.Inlines.Add("(" + lineNumber + ", " + column + ")\t"); |
|
|
|
string displayText = result.DisplayText; |
|
if (displayText != null) { |
|
textBlock.Inlines.Add(displayText); |
|
} else if (inlineBuilder != null) { |
|
textBlock.Inlines.AddRange(inlineBuilder.CreateRuns()); |
|
} |
|
|
|
if (showFileName) { |
|
textBlock.Inlines.Add( |
|
new Run { |
|
Text = StringParser.Parse("\t${res:MainWindow.Windows.SearchResultPanel.In} ") |
|
+ Path.GetFileName(result.FileName) + "(" + Path.GetDirectoryName(result.FileName) +")", |
|
FontStyle = FontStyles.Italic |
|
}); |
|
} |
|
return textBlock; |
|
} |
|
|
|
public override void ActivateItem() |
|
{ |
|
FileService.JumpToFilePosition(result.FileName, lineNumber, column); |
|
} |
|
} |
|
}
|
|
|