Skip to content

Commit

Permalink
Use find results panel to show XML errors as well
Browse files Browse the repository at this point in the history
Fixes #47
  • Loading branch information
fernandreu committed Jul 27, 2019
1 parent 52b99a9 commit 05a984e
Show file tree
Hide file tree
Showing 15 changed files with 308 additions and 232 deletions.
130 changes: 0 additions & 130 deletions OfficeRibbonXEditor/Controls/FindAllResultsPanel.xaml.cs

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<UserControl x:Class="OfficeRibbonXEditor.Controls.FindAllResultsPanel"
<UserControl x:Class="OfficeRibbonXEditor.Controls.ResultsPanel"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Expand All @@ -7,6 +7,6 @@
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<Grid>
<sn:ScintillaWPF x:Name="FindResultsScintilla"/>
<sn:ScintillaWPF x:Name="ResultsScintilla"/>
</Grid>
</UserControl>
70 changes: 70 additions & 0 deletions OfficeRibbonXEditor/Controls/ResultsPanel.xaml.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
using System.Windows.Forms;
using OfficeRibbonXEditor.Interfaces;
using ScintillaNET;
using UserControl = System.Windows.Controls.UserControl;

namespace OfficeRibbonXEditor.Controls
{
/// <summary>
/// Interaction logic for ResultsPanel.xaml
/// </summary>
public partial class ResultsPanel : UserControl
{
public ResultsPanel()
{
this.InitializeComponent();

this.ResultsScintilla.Styles[ScintillaNET.Style.Default].Font = "Consolas";
this.ResultsScintilla.Styles[ScintillaNET.Style.Default].Size = 10;

this.ResultsScintilla.ClearAll();

this.ResultsScintilla.Scintilla.KeyUp += this.FindResultsScintilla_KeyUp;
this.ResultsScintilla.Scintilla.MouseClick += this.FindResultsScintilla_MouseClick;
this.ResultsScintilla.Scintilla.MouseDoubleClick += this.FindResultsScintilla_MouseDoubleClick;
}

private IResultCollection Results { get; set; }

public Scintilla Scintilla { get; set; }

/// <summary>
/// Updates the find all results panel
/// </summary>
/// <param name="editor">The Scintilla editor used to generate the find results.</param>
/// <param name="results"></param>
public void UpdateFindAllResults(IResultCollection results)
{
this.Results = results;
this.Results.AddToPanel(this.Scintilla, this.ResultsScintilla.Scintilla);
}

private void FindResultsScintilla_KeyUp(object sender, KeyEventArgs e)
{
var pos = this.ResultsScintilla.CurrentPosition;
this.Results.GoToPosition(pos, this.Scintilla, this.ResultsScintilla.Scintilla);
}

private void FindResultsScintilla_MouseClick(object sender, MouseEventArgs e)
{
var pos = this.ResultsScintilla.CharPositionFromPointClose((e.Location).X, (e.Location).Y);
if (pos == -1)
{
return;
}

this.Results.GoToPosition(pos, this.Scintilla, this.ResultsScintilla.Scintilla);
}

private void FindResultsScintilla_MouseDoubleClick(object sender, MouseEventArgs e)
{
var pos = this.ResultsScintilla.CharPositionFromPointClose((e.Location).X, (e.Location).Y);
if (pos == -1)
{
return;
}

this.Results.GoToPosition(pos, this.Scintilla, this.ResultsScintilla.Scintilla);
}
}
}
11 changes: 11 additions & 0 deletions OfficeRibbonXEditor/Interfaces/IResultCollection.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using ScintillaNET;

namespace OfficeRibbonXEditor.Interfaces
{
public interface IResultCollection
{
void AddToPanel(Scintilla editor, Scintilla resultsPanel);

void GoToPosition(int pos, Scintilla editor, Scintilla resultsPanel);
}
}
9 changes: 9 additions & 0 deletions OfficeRibbonXEditor/Models/DataEventArgs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,15 @@ namespace OfficeRibbonXEditor.Models
/// <typeparam name="T">The type of the Data property</typeparam>
public class DataEventArgs<T> : EventArgs
{
public DataEventArgs()
{
}

public DataEventArgs(T data)
{
this.Data = data;
}

/// <summary>
/// Gets or sets the data passed by the event
/// </summary>
Expand Down
11 changes: 6 additions & 5 deletions OfficeRibbonXEditor/Models/FindReplace.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@
using System.Collections.Generic;
using System.Drawing;
using System.Text.RegularExpressions;
using OfficeRibbonXEditor.Controls.Forms;
using OfficeRibbonXEditor.Interfaces;
using ScintillaNET;
using CharacterRange = OfficeRibbonXEditor.Models.CharacterRange;

namespace OfficeRibbonXEditor.Models
{
using ResultsEventArgs = DataEventArgs<IResultCollection>;

public class FindReplace
{
private const SearchFlags Flags = SearchFlags.None;
Expand Down Expand Up @@ -42,7 +43,7 @@ public FindReplace(Scintilla scintilla)

public event ReplaceAllResultsEventHandler ReplaceAllResults;

public delegate void FindAllResultsEventHandler(object sender, FindResultsEventArgs findAllResults);
public delegate void FindAllResultsEventHandler(object sender, ResultsEventArgs findAllResults);

public delegate void ReplaceAllResultsEventHandler(object sender, ReplaceResultsEventArgs findAllResults);

Expand Down Expand Up @@ -384,7 +385,7 @@ public List<CharacterRange> FindAll(int startPos, int endPos, string searchStrin
startPos = r.cpMax;
}

this.FindAllResults?.Invoke(this, new FindResultsEventArgs(this, results));
this.FindAllResults?.Invoke(this, new ResultsEventArgs(new FindResults(results)));

return results;
}
Expand Down Expand Up @@ -424,7 +425,7 @@ public List<CharacterRange> FindAll(CharacterRange rangeToSearch, Regex findExpr
rangeToSearch = new CharacterRange(r.cpMax, rangeToSearch.cpMax);
}

this.FindAllResults?.Invoke(this, new FindResultsEventArgs(this, results));
this.FindAllResults?.Invoke(this, new ResultsEventArgs(new FindResults(results)));

return results;
}
Expand Down
77 changes: 77 additions & 0 deletions OfficeRibbonXEditor/Models/FindResults.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
using System.Collections.Generic;
using System.Drawing;
using OfficeRibbonXEditor.Interfaces;
using ScintillaNET;

namespace OfficeRibbonXEditor.Models
{
public class FindResults : IResultCollection
{
public FindResults(IEnumerable<CharacterRange> items)
{
this.Items = new List<CharacterRange>(items);
}

public List<CharacterRange> Items { get; }

public void AddToPanel(Scintilla editor, Scintilla resultsPanel)
{
resultsPanel.ClearAll();

var indicator = resultsPanel.Indicators[16];
indicator.ForeColor = Color.Red;
indicator.Alpha = 100;
indicator.Style = IndicatorStyle.RoundBox;
indicator.Under = true;
resultsPanel.IndicatorCurrent = indicator.Index;

//Write lines
foreach (var item in this.Items)
{
var startLine = editor.LineFromPosition(item.cpMin);
var endLine = editor.LineFromPosition(item.cpMax);

if (startLine == endLine)
{
var resultsLinePrefix = $"Line {startLine + 1}: ";

resultsPanel.AppendText($"{resultsLinePrefix}{editor.Lines[startLine].Text}");
}
}

//Highlight
var resultLineIndex = 0;
foreach (var item in this.Items)
{
var startLine = editor.LineFromPosition(item.cpMin);
var endLine = editor.LineFromPosition(item.cpMax);

if (startLine == endLine)
{
var resultsLinePrefix = $"Line {startLine + 1}: ";

var linePos = editor.Lines[startLine].Position;
var startPosInLine = item.cpMin - linePos;

var lastLineStartPos = resultsPanel.Lines[resultLineIndex].Position;

resultsPanel.IndicatorFillRange(lastLineStartPos + resultsLinePrefix.Length + startPosInLine, item.cpMax - item.cpMin);

resultLineIndex++;
}
}
}

public void GoToPosition(int pos, Scintilla editor, Scintilla resultsPanel)
{
var selectedLine = resultsPanel.LineFromPosition(pos);

var charRange = this.Items[selectedLine];
editor.GotoPosition(charRange.cpMax);
editor.GotoPosition(charRange.cpMin);
editor.SetSelection(charRange.cpMin, charRange.cpMax);
editor.ScrollCaret();
editor.Focus();
}
}
}
18 changes: 0 additions & 18 deletions OfficeRibbonXEditor/Models/FindResultsEventArgs.cs

This file was deleted.

11 changes: 11 additions & 0 deletions OfficeRibbonXEditor/Models/XmlError.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
namespace OfficeRibbonXEditor.Models
{
public class XmlError
{
public int LineNumber { get; set; }

public int LinePosition { get; set; }

public string Message { get; set; }
}
}
Loading

0 comments on commit 05a984e

Please sign in to comment.