void FillCache(SearchResultWidget widget) { location = DocumentLocation.Empty; copyData = ""; markup = selectedMarkup = ""; var doc = GetDocument(); if (doc == null) { return; } try { int lineNr = doc.OffsetToLineNumber(Offset); var line = doc.GetLine(lineNr); if (line != null) { location = new DocumentLocation(lineNr, Offset - line.Offset + 1); copyData = $"{FileName} ({location.Value.Line}, {location.Value.Column}):{doc.GetTextAt (line.Offset, line.Length)}"; CreateMarkup(widget, doc, line); } } catch (Exception e) { LoggingService.LogError("Error while getting search result", e); } }
async Task FillCache(SearchResultWidget widget) { FillLineCache(widget); copyData = ""; markup = selectedMarkup = ""; try { var doc = GetDocument(); if (doc == null) { return; } var lineNr = location.Value.Line; var line = doc.GetLine(lineNr); if (line != null) { location = new DocumentLocation(lineNr, Offset - line.Offset + 1); copyData = $"{FileName} ({location.Value.Line}, {location.Value.Column}):{doc.GetTextAt (line.Offset, line.Length)}"; markup = await CreateMarkupAsync(widget, doc, line); widget.QueueDraw(); } } catch (Exception e) { LoggingService.LogError("Error while getting search result", e); } }
internal string GetCopyData(SearchResultWidget widget) { if (copyData == null) { FillCache(widget).Ignore(); } return(copyData); }
internal DocumentLocation GetLocation(SearchResultWidget widget) { if (!location.HasValue) { FillLineCache(widget); } return(location.Value); }
internal int GetLineNumber(SearchResultWidget widget) { if (!location.HasValue) { FillLineCache(widget); } return(location.Value.Line); }
internal string GetMarkup(SearchResultWidget widget, bool isSelected) { if (markup == null) { FillCache(widget).Ignore(); } return(isSelected ? selectedMarkup : markup); }
public void TestIssue6015() { var widget = new SearchResultWidget(); var fileName = Path.GetTempFileName(); string file = @"test test test"; File.WriteAllText(fileName, file); var provider = new FileProvider(fileName); var idx1 = file.IndexOf("test", StringComparison.Ordinal); var sr1 = new SearchResult(provider, idx1, "test".Length); Assert.AreEqual("<span background=\"#E6EA00\">test</span> test test", sr1.GetMarkup(widget, true)); file = @"using System; using System.Collections.Generic; namespace MyLibrary { class FooBar {int test; public int Test { get { return test; } } public FooBar () { Console.WriteLine (test); } } }"; File.WriteAllText(fileName, file); try { provider = new FileProvider(fileName); idx1 = file.IndexOf("test", StringComparison.Ordinal); sr1 = new SearchResult(provider, idx1, "test".Length); var idx2 = file.IndexOf("test", idx1 + 1, StringComparison.Ordinal); var sr2 = new SearchResult(provider, idx2, "test".Length); var idx3 = file.IndexOf("test", idx2 + 1, StringComparison.Ordinal); var sr3 = new SearchResult(provider, idx3, "test".Length); Assert.AreEqual("{int <span background=\"#E6EA00\">test</span>;", sr1.GetMarkup(widget, true)); Assert.AreEqual("return <span background=\"#E6EA00\">test</span>;", sr2.GetMarkup(widget, true)); Assert.AreEqual("Console.WriteLine (<span background=\"#E6EA00\">test</span>);", sr3.GetMarkup(widget, true)); } finally { File.Delete(fileName); } }
public void TestCropStart() { var widget = new SearchResultWidget(); var fileName = Path.GetTempFileName(); var sb = new StringBuilder(); sb.AppendLine(new string ('a', 100) + "test" + new string ('b', 5)); File.WriteAllText(fileName, sb.ToString()); try { var provider = new FileProvider(fileName); var sr = new SearchResult(provider, 100, "test".Length); var markup = sr.GetMarkup(widget, true); Assert.AreEqual("…aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<span background=\"#E6EA00\">test</span>bbbbb", markup); } finally { File.Delete(fileName); } }
public void TestCropBoth() { var widget = new SearchResultWidget(); var fileName = Path.GetTempFileName(); var sb = new StringBuilder(); sb.AppendLine(new string ('a', maximumMarkupLength * 2) + "test" + new string ('b', maximumMarkupLength * 2)); File.WriteAllText(fileName, sb.ToString()); try { var provider = new FileProvider(fileName); var sr = new SearchResult(provider, maximumMarkupLength * 2, "test".Length); var markup = sr.GetMarkup(widget, true); Assert.AreEqual("…" + new string ('a', (maximumMarkupLength - 5 - "test".Length) / 2 + "test".Length) + "<span background=\"#E6EA00\">test</span>" + new string ('b', (maximumMarkupLength - "test".Length) / 2 - 1) + "…", markup); } finally { File.Delete(fileName); } }
public void TestIssue5949() { var widget = new SearchResultWidget(); var fileName = Path.GetTempFileName(); var sb = new StringBuilder(); sb.AppendLine("test"); sb.AppendLine("test"); sb.AppendLine("test"); File.WriteAllText(fileName, sb.ToString()); try { var provider = new FileProvider(fileName); var sr = new SearchResult(provider, 0, "test".Length + 1); var markup = sr.GetMarkup(widget, true); Assert.AreEqual("<span background=\"#E6EA00\">test</span>", markup); } finally { File.Delete(fileName); } }
void FillLineCache(SearchResultWidget widget) { if (location != null) { return; } location = DocumentLocation.Empty; var doc = GetDocument(); if (doc == null) { return; } int lineNr = doc.OffsetToLineNumber(Offset); var line = doc.GetLine(lineNr); if (line != null) { location = new DocumentLocation(lineNr, Offset - line.Offset + 1); } }
async Task <string> CreateMarkupAsync(SearchResultWidget widget, TextEditor doc, Editor.IDocumentLine line) { int startIndex = 0, endIndex = 0; int indent = line.GetIndentation(doc).Length; string lineText; int col = Offset - line.Offset; int markupStartOffset = 0; bool trimStart = false, trimEnd = false; int length; if (col < indent) { trimEnd = line.Length > maximumMarkupLength; length = Math.Min(maximumMarkupLength, line.Length); // search result contained part of the indent. lineText = doc.GetTextAt(line.Offset, length); } else { // if not crop the indent length = line.Length - indent; if (length > maximumMarkupLength) { markupStartOffset = Math.Min(Math.Max(0, col - indent - maximumMarkupLength / 2), line.Length - maximumMarkupLength); trimEnd = markupStartOffset + maximumMarkupLength < line.Length; trimStart = markupStartOffset > 0; length = maximumMarkupLength; } lineText = doc.GetTextAt(line.Offset + markupStartOffset + indent, length); col -= indent; } if (col >= 0) { uint start; uint end; try { start = (uint)TranslateIndexToUTF8(lineText, col - markupStartOffset); end = (uint)TranslateIndexToUTF8(lineText, Math.Min(lineText.Length, col - markupStartOffset + Length)); } catch (Exception e) { LoggingService.LogError("Exception while translating index to utf8 (column was:" + col + " search result length:" + Length + " line text:" + lineText + ")", e); return(""); } startIndex = (int)start; endIndex = (int)end; } var tabSize = doc.Options.TabSize; this.markup = this.selectedMarkup = markup = Ambience.EscapeText(lineText); var searchColor = GetBackgroundMarkerColor(widget.HighlightStyle); var selectedSearchColor = widget.Style.Base(Gtk.StateType.Selected); selectedSearchColor = searchColor.AddLight(-0.2); double b1 = HslColor.Brightness(searchColor); double b2 = HslColor.Brightness(SearchResultWidget.AdjustColor(widget.Style.Base(Gtk.StateType.Normal), SyntaxHighlightingService.GetColor(widget.HighlightStyle, EditorThemeColors.Foreground))); // selected markup = FormatMarkup(PangoHelper.ColorMarkupBackground(selectedMarkup, (int)startIndex, (int)endIndex, searchColor), trimStart, trimEnd, tabSize); selectedMarkup = FormatMarkup(PangoHelper.ColorMarkupBackground(selectedMarkup, (int)startIndex, (int)endIndex, selectedSearchColor), trimStart, trimEnd, tabSize); string newMarkup; using (var markupTimeoutSource = new CancellationTokenSource(150)) { newMarkup = await doc.GetMarkupAsync(line.Offset + markupStartOffset + indent, length, new MarkupOptions (MarkupFormat.Pango), markupTimeoutSource.Token).ConfigureAwait(false); newMarkup = widget.AdjustColors(newMarkup); } try { double delta = Math.Abs(b1 - b2); if (delta < 0.1) { var color1 = SyntaxHighlightingService.GetColor(widget.HighlightStyle, EditorThemeColors.FindHighlight); if (color1.L + 0.5 > 1.0) { color1.L -= 0.5; } else { color1.L += 0.5; } searchColor = color1; } if (startIndex != endIndex) { newMarkup = PangoHelper.ColorMarkupBackground(newMarkup, (int)startIndex, (int)endIndex, searchColor); } } catch (Exception e) { LoggingService.LogError("Error while setting the text renderer markup to: " + newMarkup, e); } return(FormatMarkup(newMarkup, trimStart, trimEnd, tabSize)); }
void CreateMarkup(SearchResultWidget widget, TextEditor doc, Editor.IDocumentLine line) { int startIndex = 0, endIndex = 0; int indent = line.GetIndentation(doc).Length; string lineText; int col = Offset - line.Offset; int markupStartOffset = 0; bool trimStart = false, trimEnd = false; if (col < indent) { trimEnd = line.Length > maximumMarkupLength; // search result contained part of the indent. lineText = doc.GetTextAt(line.Offset, Math.Min(maximumMarkupLength, line.Length)); markup = doc.GetMarkup(line.Offset, Math.Min(maximumMarkupLength, line.Length), new MarkupOptions(MarkupFormat.Pango)); } else { // if not crop the indent var length = line.Length - indent; if (length > maximumMarkupLength) { markupStartOffset = Math.Min(Math.Max(0, col - indent - maximumMarkupLength / 2), line.Length - maximumMarkupLength); trimEnd = markupStartOffset + maximumMarkupLength < line.Length; trimStart = markupStartOffset > 0; length = maximumMarkupLength; } lineText = doc.GetTextAt(line.Offset + markupStartOffset + indent, length); markup = doc.GetMarkup(line.Offset + markupStartOffset + indent, length, new MarkupOptions(MarkupFormat.Pango)); col -= indent; } selectedMarkup = Ambience.EscapeText(lineText); markup = widget.AdjustColors(markup); if (col >= 0) { uint start; uint end; try { start = (uint)TranslateIndexToUTF8(lineText, col - markupStartOffset); end = (uint)TranslateIndexToUTF8(lineText, Math.Min(lineText.Length, col - markupStartOffset + Length)); } catch (Exception e) { LoggingService.LogError("Exception while translating index to utf8 (column was:" + col + " search result length:" + Length + " line text:" + lineText + ")", e); return; } startIndex = (int)start; endIndex = (int)end; } try { var searchColor = GetBackgroundMarkerColor(widget.HighlightStyle); double b1 = HslColor.Brightness(searchColor); double b2 = HslColor.Brightness(SearchResultWidget.AdjustColor(widget.Style.Base(Gtk.StateType.Normal), SyntaxHighlightingService.GetColor(widget.HighlightStyle, EditorThemeColors.Foreground))); double delta = Math.Abs(b1 - b2); if (delta < 0.1) { var color1 = SyntaxHighlightingService.GetColor(widget.HighlightStyle, EditorThemeColors.FindHighlight); if (color1.L + 0.5 > 1.0) { color1.L -= 0.5; } else { color1.L += 0.5; } searchColor = color1; } if (startIndex != endIndex) { markup = PangoHelper.ColorMarkupBackground(markup, (int)startIndex, (int)endIndex, searchColor); } // selected var selectedSearchColor = widget.Style.Base(Gtk.StateType.Selected); selectedSearchColor = searchColor.AddLight(-0.2); selectedMarkup = PangoHelper.ColorMarkupBackground(selectedMarkup, (int)startIndex, (int)endIndex, selectedSearchColor); } catch (Exception e) { LoggingService.LogError("Error while setting the text renderer markup to: " + markup, e); } markup = markup.Replace("\t", new string (' ', doc.Options.TabSize)); selectedMarkup = selectedMarkup.Replace("\t", new string (' ', doc.Options.TabSize)); if (trimStart) { markup = "…" + markup; selectedMarkup = "…" + selectedMarkup; } if (trimEnd) { markup += "…"; selectedMarkup += "…"; } }