Inheritance: Gtk.Bin, ILocationList
Exemple #1
0
        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);
            }
        }
Exemple #2
0
        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);
            }
        }
Exemple #3
0
 internal string GetCopyData(SearchResultWidget widget)
 {
     if (copyData == null)
     {
         FillCache(widget).Ignore();
     }
     return(copyData);
 }
Exemple #4
0
 internal DocumentLocation GetLocation(SearchResultWidget widget)
 {
     if (!location.HasValue)
     {
         FillLineCache(widget);
     }
     return(location.Value);
 }
Exemple #5
0
 internal int GetLineNumber(SearchResultWidget widget)
 {
     if (!location.HasValue)
     {
         FillLineCache(widget);
     }
     return(location.Value.Line);
 }
Exemple #6
0
 internal string GetMarkup(SearchResultWidget widget, bool isSelected)
 {
     if (markup == null)
     {
         FillCache(widget).Ignore();
     }
     return(isSelected ? selectedMarkup : markup);
 }
Exemple #7
0
        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);
            }
        }
Exemple #8
0
        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);
            }
        }
Exemple #9
0
        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);
            }
        }
Exemple #10
0
        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);
            }
        }
Exemple #11
0
        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);
            }
        }
Exemple #12
0
        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));
        }
Exemple #13
0
        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 += "…";
            }
        }