From f2251879f6a33031b20e624ec35335d3ed6169a9 Mon Sep 17 00:00:00 2001 From: Hildebrando Chavez Date: Sat, 3 May 2025 17:56:29 -0600 Subject: [PATCH 1/2] Improve search box functionality --- .vscode/settings.json | 3 + .../Constants.cs | 2 + .../LightQueryProfiler.WinFormsApp.csproj | 6 +- .../Presenters/MainPresenter.cs | 87 ++++++++++++------- .../Views/IMainView.cs | 7 +- .../Views/MainView.cs | 45 +++++++--- 6 files changed, 99 insertions(+), 51 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..fa43867 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "cSpell.words": ["roslynator"] +} diff --git a/src/LightQueryProfiler.WinFormsApp/Constants.cs b/src/LightQueryProfiler.WinFormsApp/Constants.cs index f082cd1..3f6660f 100644 --- a/src/LightQueryProfiler.WinFormsApp/Constants.cs +++ b/src/LightQueryProfiler.WinFormsApp/Constants.cs @@ -9,5 +9,7 @@ public static class Constants public const string RESUME_BMP_ENC = "iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAsTAAALEwEAmpwYAAADFUlEQVR4nO2ZS0hUURjHb0EURFDrojYuWhV6iyyzMubh25nMAp/zsjTNScMeLpwJhxKEWqSUID3MRQ8yQxvnnHHuGUqEwEXlzjIkCGphiFI6nst8ce+dR40GLsZmDtw/fLvvnvP9vu/cc889H8epUqVKVVLK54NdiIgjmNAAJiIoRgNIEL1eL+yM9ScENiFC25FAJ5EgjnkINXCJFJKDDwceY4KIY/0xoV3LfWnf0BvYlhAA/Ffmo2Y0ucBgcgVj/RGhsyv5I0K/Ij/NSQCAuGL207Rm2VbrHwERaO/AKGxhFgAr1Zj2+GkWswBYqUQQE9qNEGxmEuCPakwN+5cymQUIVYNKW6/bDRuZBMDRbXlieCSQxi4AkauxJFVjfBw2MAmAo/bWQ2A3ywCABLqABfGywwHrmQTAURv1EEhhGQAwoT+xINoBYB2jAKKyrIjocRPYwSwAVqoxg/1iCcMAonIU8dFCJgH6h37AUeMFsDZ2TzEJ0HytX547v8zxmSmA54MzUFp7MzS3BTIK64zMAHR0jUFGQb085/5s2zyvNbHxEr8cnpPWemS+9Nza13uPV25fVfCJBrjd8w6OGRuVrOurF3m9rYbjuOT/kA2ieahpvh+Z41B+/YdUnZWNo0TXvQnIKr4oj71PXy0ezKtzcg5H8h/mXuFf0NT6FHitRR43s6jhE6+rYuM43dM3CfrTV0NZtwazTjTd5fkzyf9D4/YuKFnXWeWxjhjs3w/n1fJxCXytAR4+mYb88tZQ1i3BnNKWvpTs88n/U+/xLUHL9UFpW1SybrTP6UouaeMe+FoAPHr2BQornfJzvM4CeWWtvj3a8uS/2EICBdctAQ7knA2v9YViW/upNQ08XgCPX3yDk9YbEX+Dqe19UZVjK5fI6/UB96wSkMa0+K/rdffIIjg7MKTn1ij7uqGBVtk7G/5b4GFJnZhwPyCcxbClaswrNTg6ZX9zW8Sv2NL+sbLxzuoPYPFuMUmdGKmZEQleYw6kakyI11QsazFJ95vSzVrdld6Zggrn7LnmB664BqRKlSpVXDLqN0tRWCSIb+HsAAAAAElFTkSuQmCC"; public const string SEARCH_BMP_ENC = "iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAsTAAALEwEAmpwYAAADLUlEQVR4nO2YWU8TURiG505N0DuTarkwBlxiIhLxn4hL4o3GiPuOMWo0uJJGiQtKaYHSVqORH6DxpuFCIdUQ4pK4QJu2YKWgFBi00xYec1oX3BJxzsxI0jc5N3P1PGfO9n2KUkghhfxT/DDPDxu9E7hbswRbsyQ8WdKeDOmWDImmDMHmDK5GjQ1NMFf5X+KFJT5o9k0w7p2E1on88IiRhZYsNGfyw50GlwaNKcadKZoaUpRaBn4X5vjgohcyvkn4a3gNnCm48QnqP5K+No7DA7NNhb8FpX545gP+Ff56XoCr43B5jI46lQWmwHuh3A8JWfBXVLiswqVRYo4xVpox89Lh68ZyAlwcIeZQsRkCL9apH7oNhMcxArVJnlyKMke6gNiwJsBz4QOcfU+N9KNSz2kzHfhz7+HMEGOnBiQupdw5bx48NYNwKsENaTfstC4pOfCcHECtHpRwY+eeB+bDc+IdHI+zXrdA7m1jAfyxOBx9S6NugdzDzBp4qvvp0C3gyTJoBfyRfjgcY0C3QEsWzRL4PjgUI6VfIINmETwHonIEBi2CZ29EwhL6UkmZDr8vArtDEjaxKAOtgN8Thl29OHULiBrWEvgQ7AhRqVugHoqcKVSz4bf3oO58TpEiI6IAN3Xme2FbDy5FVkT3QBTgZsFX9aBtfsViRWZE98AkeLa+4YJiREkpugdGw68NDqdX+LrKFCNSr2KrGyVqFPymZ59Y6n3MsraX8fIHQ8sNkRCtj1z3QDb804+suNnF0jsvWHU/TkV7sq88kCwxROLcKPNrk7TLgq8MDmul3mAe/t5b1rSP5MbqQPJRsTtqjMQVmCW6B6eHUPWcNltfc37l7e4ly9tehsXMf4WvCCRDdk/s3QJXNG5zh41ZTiKieyAKcFHDTueSquqhcepRWRaIL6poHwn/AO+OkhtGS3wRKRI17NF+nEf66RTFyMEY2v4omnhV7g7TubOXhqoQ6/50w5YHkiWrA8mHxZ6+7/BmSsiIvSFWanNH+n4RKEiYHHvhT8yAP2FzR14pMyH230m4IpM2V2S7MlNinyox0+B/kni9sCm65dvHQgopRJmaz39BUHt8KVcUAAAAAElFTkSuQmCC"; public const string STOP_BMP_ENC = "iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAsTAAALEwEAmpwYAAABFUlEQVR4nO1YQQrCMBDsl6w+oT2p957U+oBe/ICg+ADBSzNfUX/jXfSWhUiLBVGExkM36gzMObOzk82SKCII4ndhjRkLcLTGXAVwXdJWZxpzsGU5+kw8sOlatLwrBlh/4ry6cHkswqcTVWy0Bcsr9z7xuQQg2DWcZYWbZIX4dMCFxDjNa7IAYQfACLWC9qUVXmLouy4co9B3XviQIQzGXCXADjhGKOU6DU4h4RhtCe2xKXzIoO+6cJWAvvPCZQ5hMP67ddoG9Ll72u5q8b0kP7fvgDEHbeFyJxbLpgCP7/WyHIXgPBZLN0jnUhXQT+bD1gXcY7R+/J9vcqjCJF95iX/qxH6aFbUL3XJ2qWLj7TxBENFX4QYSuSsjccyTLgAAAABJRU5ErkJggg=="; + public const string FIND_NEXT_BMP_ENC = "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"; + public const string CLEAR_SEARCH_BMP_ENC = "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"; } } \ No newline at end of file diff --git a/src/LightQueryProfiler.WinFormsApp/LightQueryProfiler.WinFormsApp.csproj b/src/LightQueryProfiler.WinFormsApp/LightQueryProfiler.WinFormsApp.csproj index 746cb18..758d233 100644 --- a/src/LightQueryProfiler.WinFormsApp/LightQueryProfiler.WinFormsApp.csproj +++ b/src/LightQueryProfiler.WinFormsApp/LightQueryProfiler.WinFormsApp.csproj @@ -8,9 +8,9 @@ enable true LightQueryProfiler - 1.0.0 - 1.0.0 - 1.0.0 + 1.0.1 + 1.0.1 + 1.0.1 diff --git a/src/LightQueryProfiler.WinFormsApp/Presenters/MainPresenter.cs b/src/LightQueryProfiler.WinFormsApp/Presenters/MainPresenter.cs index ad7fa05..c8e7c39 100644 --- a/src/LightQueryProfiler.WinFormsApp/Presenters/MainPresenter.cs +++ b/src/LightQueryProfiler.WinFormsApp/Presenters/MainPresenter.cs @@ -41,6 +41,8 @@ public class MainPresenter private IXEventService? _xEventService; private Dictionary CurrentRows = new(); private Dictionary? Filters; + private int currentIndex = 0; + public MainPresenter(IMainView mainView) { view = mainView; @@ -55,7 +57,8 @@ public MainPresenter(IMainView mainView) view.OnClearEvents += OnClearEvents; view.OnFiltersClick += OnFiltersClick; view.OnClearFiltersClick += OnClearFiltersClick; - view.OnSearch += OnSearch; + view.OnClearSearch += OnClearSearch; + view.OnFindNext += OnNextSearch; view.OnRecentConnectionsClick += OnRecentConnectionsClick; _connectionRepository = new ConnectionRepository(new SqliteContext()); view.Show(); @@ -410,9 +413,48 @@ private void OnResume(object? sender, EventArgs e) _thread.Start(); } - private void OnSearch(object? sender, EventArgs e) + private void OnClearSearch(object? sender, EventArgs e) { - SearchGridValue(view.SearchValue?.Trim() ?? ""); + view.SearchValue = string.Empty; + currentIndex = 0; + view.ProfilerGridView.ClearSelection(); + } + + private void OnNextSearch(object? sender, EventArgs e) + { + try + { + if (view.ProfilerGridView.Rows.Count > 0) + { + if (string.IsNullOrEmpty(view.SearchValue)) + { + MessageBox.Show("Please enter a search value.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + currentIndex = FindGridValue(view.SearchValue, currentIndex); + if (currentIndex != -1) + { + view.ProfilerGridView.ClearSelection(); + view.ProfilerGridView.FirstDisplayedScrollingRowIndex = currentIndex; + view.ProfilerGridView.Rows[currentIndex].Selected = true; + RowEnter(sender, new DataGridViewCellEventArgs(0, currentIndex)); + currentIndex++; + } + else + { + MessageBox.Show("No more results found.", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information); + currentIndex = 0; + } + } + } + catch (Exception exc) + { + currentIndex = 0; + MessageBox.Show(exc.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + ShowButtonsByAction("default"); + } + } private void OnStart(object? sender, EventArgs e) @@ -480,43 +522,22 @@ private async Task SaveRecentConnection() } } - private void SearchGridValue(string searchValue) + private int FindGridValue(string searchValue, int startIndex) { - if (view.ProfilerGridView.Rows.Count > 0) + for (int index = startIndex; index < view.ProfilerGridView.Rows.Count; index++) { - view.ProfilerGridView.ClearSelection(); - try + DataGridViewRow row = view.ProfilerGridView.Rows[index]; + for (int i = 0; i < row.Cells.Count; i++) { - List foundRows = new List(); - foreach (DataGridViewRow row in view.ProfilerGridView.Rows) - { - for (int i = 0; i < row.Cells.Count; i++) - { - string celValue = row.Cells[i]?.Value?.ToString() ?? ""; - if (celValue.Contains(searchValue, StringComparison.OrdinalIgnoreCase)) - { - int rowIndex = row.Index; - view.ProfilerGridView.Rows[rowIndex].Selected = true; - foundRows.Add(rowIndex); - break; - } - } - } - if (foundRows?.Count > 0) - { - view.ProfilerGridView.FirstDisplayedScrollingRowIndex = foundRows[0]; - } - else + string celValue = row.Cells[i]?.Value?.ToString() ?? ""; + if (celValue.Contains(searchValue, StringComparison.OrdinalIgnoreCase)) { - MessageBox.Show($"{searchValue} not found.", "LightQueryProfiler", MessageBoxButtons.OK, MessageBoxIcon.Information); + return row.Index; } } - catch (Exception exc) - { - MessageBox.Show(exc.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - ShowButtonsByAction("default"); - } } + + return -1; } private void SetCurrentRows(ProfilerEvent? _event) diff --git a/src/LightQueryProfiler.WinFormsApp/Views/IMainView.cs b/src/LightQueryProfiler.WinFormsApp/Views/IMainView.cs index 4692bb8..ec295d8 100644 --- a/src/LightQueryProfiler.WinFormsApp/Views/IMainView.cs +++ b/src/LightQueryProfiler.WinFormsApp/Views/IMainView.cs @@ -13,8 +13,8 @@ public interface IMainView event EventHandler OnPause; event EventHandler OnResume; - - event EventHandler OnSearch; + event EventHandler OnClearSearch; + event EventHandler OnFindNext; event EventHandler OnStart; @@ -33,7 +33,8 @@ public interface IMainView ListView ProfilerDetails { get; } DataGridView ProfilerGridView { get; } ToolStripButton ResumeButton { get; } - ToolStripButton SearchButton { get; } + ToolStripButton ClearSearchButton { get; } + ToolStripButton FindNextButton { get; } string? SearchValue { get; set; } object? SelectedAuthenticationMode { get; set; } string? Server { get; set; } diff --git a/src/LightQueryProfiler.WinFormsApp/Views/MainView.cs b/src/LightQueryProfiler.WinFormsApp/Views/MainView.cs index 729a001..03493d4 100644 --- a/src/LightQueryProfiler.WinFormsApp/Views/MainView.cs +++ b/src/LightQueryProfiler.WinFormsApp/Views/MainView.cs @@ -8,10 +8,11 @@ public partial class MainView : Form, IMainView { private static Bitmap? clearBmp; private static Bitmap? clearFiltersBmp; + private static Bitmap? findNextBmp; + private static Bitmap? clearSearchBmp; private static Bitmap? pauseBmp; private static Bitmap? playBmp; private static Bitmap? resumeBmp; - private static Bitmap? searchBmp; private static Bitmap? stopBmp; private readonly WebBrowser webBrowser = new WebBrowser(); @@ -31,7 +32,8 @@ public partial class MainView : Form, IMainView private ToolStripButton tsbResume = new ToolStripButton(); - private ToolStripButton tsbSearch = new ToolStripButton(); + private ToolStripButton tsbClearSearch = new ToolStripButton(); + private ToolStripButton tsbFindNext = new ToolStripButton(); private ToolStripButton tsbStart = new ToolStripButton(); @@ -75,7 +77,9 @@ public MainView() public event EventHandler? OnResume; - public event EventHandler? OnSearch; + public event EventHandler? OnClearSearch; + public event EventHandler? OnFindNext; + public event EventHandler? OnStart; @@ -104,7 +108,9 @@ IList IMainView.AuthenticationModes ToolStripButton IMainView.ResumeButton => tsbResume; - ToolStripButton IMainView.SearchButton => tsbSearch; + ToolStripButton IMainView.ClearSearchButton => tsbClearSearch; + ToolStripButton IMainView.FindNextButton => tsbFindNext; + string? IMainView.SearchValue { get => tstSearch.Text; set => tstSearch.Text = value; } @@ -138,7 +144,8 @@ private static void CreateBitmaps() resumeBmp = DecodeFromBase64(Constants.RESUME_BMP_ENC); clearBmp = DecodeFromBase64(Constants.CLEAR_BMP_ENC); clearFiltersBmp = DecodeFromBase64(Constants.CLEAR_FILTERS_BMP_ENC); - searchBmp = DecodeFromBase64(Constants.SEARCH_BMP_ENC); + findNextBmp = DecodeFromBase64(Constants.FIND_NEXT_BMP_ENC); + clearSearchBmp = DecodeFromBase64(Constants.CLEAR_SEARCH_BMP_ENC); } private static Bitmap DecodeFromBase64(string data) @@ -182,9 +189,9 @@ private void BtnResume_Click(object? sender, EventArgs e) OnResume?.Invoke(this, EventArgs.Empty); } - private void BtnSearch_Click(object? sender, EventArgs e) + private void BtnNextSearch_Click(object? sender, EventArgs e) { - OnSearch?.Invoke(sender, e); + OnFindNext?.Invoke(sender, e); } private void BtnStart_Click(object? sender, EventArgs e) @@ -236,7 +243,13 @@ private void CreateEventHandlers() tsbClearEvents.Click += BtnClearEvents_Click; tsbFilters.Click += BtnFilters_Click; tsbClearFilters.Click += BtnClearFilters_Click; - tsbSearch.Click += BtnSearch_Click; + tsbClearSearch.Click += BtnClearSearch_Click; + tsbFindNext.Click += BtnNextSearch_Click; + } + + private void BtnClearSearch_Click(object? sender, EventArgs e) + { + OnClearSearch?.Invoke(sender, e); } private void CreateMainMenu() @@ -356,13 +369,21 @@ private void CreateMainToolBar() ToolStripSeparator toolStripSeparator7 = new ToolStripSeparator(); toolStripMain.Items.Add(toolStripSeparator7); + toolStripMain.Items.Add(new ToolStripLabel("Search: ")); + tstSearch.Size = new Size(100, 27); + tstSearch.ToolTipText = "Search"; toolStripMain.Items.Add(tstSearch); - tsbSearch.ToolTipText = "Search"; - tsbSearch.Text = "Search"; - tsbSearch.Image = searchBmp; - toolStripMain.Items.Add(tsbSearch); + tsbClearSearch.ToolTipText = "Clear Search"; + tsbClearSearch.Text = string.Empty; + tsbClearSearch.Image = clearSearchBmp; + toolStripMain.Items.Add(tsbClearSearch); + + tsbFindNext.ToolTipText = "Find Next"; + tsbFindNext.Text = string.Empty; + tsbFindNext.Image = findNextBmp; + toolStripMain.Items.Add(tsbFindNext); pnlHeader.Controls.Add(toolStripMain); } From 382622a957d3bde809d188451dcafeeace1b6e14 Mon Sep 17 00:00:00 2001 From: Hildebrando Chavez Date: Sat, 3 May 2025 18:01:36 -0600 Subject: [PATCH 2/2] Clean all code --- .../Configuration/XmlConfiguration.cs | 2 -- .../Data/ApplicationDbContext.cs | 4 ++-- src/LightQueryProfiler.Shared/Data/SqliteContext.cs | 11 +++++------ .../Models/DefaultProfilerSessionTemplate.cs | 1 + .../Interfaces/BaseProfilerSessionTemplate.cs | 2 +- .../Repositories/Interfaces/IRepository.cs | 6 ++---- .../Repositories/XEventRepository.cs | 2 +- .../Services/XEventService.cs | 5 ++--- .../Data/SqlHighlightService.cs | 1 + .../Presenters/MainPresenter.cs | 2 +- .../Presenters/RecentConnectionsPresenter.cs | 3 +-- src/LightQueryProfiler.WinFormsApp/Program.cs | 2 +- src/LightQueryProfiler.WinFormsApp/Views/AboutView.cs | 1 + .../Views/IAboutView.cs | 1 + src/LightQueryProfiler.WinFormsApp/Views/IMainView.cs | 3 +++ .../Views/IRecentConnectionsView.cs | 7 ++----- src/LightQueryProfiler.WinFormsApp/Views/MainView.cs | 6 +++--- .../Views/RecentConnectionsView.cs | 6 ++---- 18 files changed, 30 insertions(+), 35 deletions(-) diff --git a/src/LightQueryProfiler.Highlight/Configuration/XmlConfiguration.cs b/src/LightQueryProfiler.Highlight/Configuration/XmlConfiguration.cs index 6d81f28..102f7ba 100644 --- a/src/LightQueryProfiler.Highlight/Configuration/XmlConfiguration.cs +++ b/src/LightQueryProfiler.Highlight/Configuration/XmlConfiguration.cs @@ -3,7 +3,6 @@ using SixLabors.Fonts; using System.Drawing; using System.Text.RegularExpressions; -using System.Xml; using System.Xml.Linq; using System.Xml.XPath; @@ -38,7 +37,6 @@ private IDictionary GetDefinitions() { if (definitions == null) { - if (XmlDocument == null) { throw new ArgumentNullException(nameof(XmlDocument)); diff --git a/src/LightQueryProfiler.Shared/Data/ApplicationDbContext.cs b/src/LightQueryProfiler.Shared/Data/ApplicationDbContext.cs index 49e4159..094299f 100644 --- a/src/LightQueryProfiler.Shared/Data/ApplicationDbContext.cs +++ b/src/LightQueryProfiler.Shared/Data/ApplicationDbContext.cs @@ -1,5 +1,5 @@ -using System.Data.Common; -using Microsoft.Data.SqlClient; +using Microsoft.Data.SqlClient; +using System.Data.Common; namespace LightQueryProfiler.Shared.Data { diff --git a/src/LightQueryProfiler.Shared/Data/SqliteContext.cs b/src/LightQueryProfiler.Shared/Data/SqliteContext.cs index 315cacd..d14575d 100644 --- a/src/LightQueryProfiler.Shared/Data/SqliteContext.cs +++ b/src/LightQueryProfiler.Shared/Data/SqliteContext.cs @@ -6,7 +6,7 @@ namespace LightQueryProfiler.Shared.Data { public class SqliteContext : IDatabaseContext { - const string dataBaseName = "localStorage.db"; + private const string dataBaseName = "localStorage.db"; public IDbConnection GetConnection() { @@ -14,8 +14,7 @@ public IDbConnection GetConnection() return new SqliteConnection($"Filename={dbPath}"); } - - public async static void InitializeDatabase() + public static async void InitializeDatabase() { string dbPath = Path.Combine(AppContext.BaseDirectory, dataBaseName); if (!File.Exists(dbPath)) @@ -28,9 +27,9 @@ public async static void InitializeDatabase() const string tableCommand = @" CREATE TABLE IF NOT - EXISTS Connections + EXISTS Connections ( - Id INTEGER PRIMARY KEY, + Id INTEGER PRIMARY KEY, DataSource NVARCHAR(1000) NULL, InitialCatalog NVARCHAR(100) NULL, UserId NVARCHAR(100) NULL, @@ -44,4 +43,4 @@ CreationDate Date await createTable.ExecuteReaderAsync(); } } -} +} \ No newline at end of file diff --git a/src/LightQueryProfiler.Shared/Models/DefaultProfilerSessionTemplate.cs b/src/LightQueryProfiler.Shared/Models/DefaultProfilerSessionTemplate.cs index 14452fc..0831212 100644 --- a/src/LightQueryProfiler.Shared/Models/DefaultProfilerSessionTemplate.cs +++ b/src/LightQueryProfiler.Shared/Models/DefaultProfilerSessionTemplate.cs @@ -8,6 +8,7 @@ public DefaultProfilerSessionTemplate() { Name = "Default"; } + public override string GetDefaultView() => "DefaultProfilerViewTemplate"; public override string CreateSQLStatement(string sessionName) diff --git a/src/LightQueryProfiler.Shared/Repositories/Interfaces/BaseProfilerSessionTemplate.cs b/src/LightQueryProfiler.Shared/Repositories/Interfaces/BaseProfilerSessionTemplate.cs index ba201ac..ccc1641 100644 --- a/src/LightQueryProfiler.Shared/Repositories/Interfaces/BaseProfilerSessionTemplate.cs +++ b/src/LightQueryProfiler.Shared/Repositories/Interfaces/BaseProfilerSessionTemplate.cs @@ -8,4 +8,4 @@ public abstract class BaseProfilerSessionTemplate public abstract string CreateSQLStatement(string sessionName); } -} +} \ No newline at end of file diff --git a/src/LightQueryProfiler.Shared/Repositories/Interfaces/IRepository.cs b/src/LightQueryProfiler.Shared/Repositories/Interfaces/IRepository.cs index e497e62..f6a300f 100644 --- a/src/LightQueryProfiler.Shared/Repositories/Interfaces/IRepository.cs +++ b/src/LightQueryProfiler.Shared/Repositories/Interfaces/IRepository.cs @@ -1,6 +1,4 @@ -using System.Linq.Expressions; - -namespace LightQueryProfiler.Shared.Repositories.Interfaces +namespace LightQueryProfiler.Shared.Repositories.Interfaces { public interface IRepository { @@ -16,4 +14,4 @@ public interface IRepository Task Find(Func predicate); } -} +} \ No newline at end of file diff --git a/src/LightQueryProfiler.Shared/Repositories/XEventRepository.cs b/src/LightQueryProfiler.Shared/Repositories/XEventRepository.cs index 8525e8e..546b6df 100644 --- a/src/LightQueryProfiler.Shared/Repositories/XEventRepository.cs +++ b/src/LightQueryProfiler.Shared/Repositories/XEventRepository.cs @@ -1,8 +1,8 @@ using LightQueryProfiler.Shared.Data; using LightQueryProfiler.Shared.Repositories.Interfaces; +using Microsoft.Data.SqlClient; using System.Data; using System.Data.Common; -using Microsoft.Data.SqlClient; namespace LightQueryProfiler.Shared.Repositories { diff --git a/src/LightQueryProfiler.Shared/Services/XEventService.cs b/src/LightQueryProfiler.Shared/Services/XEventService.cs index 2871f16..36ff8bf 100644 --- a/src/LightQueryProfiler.Shared/Services/XEventService.cs +++ b/src/LightQueryProfiler.Shared/Services/XEventService.cs @@ -8,7 +8,6 @@ public class XEventService : IXEventService { public XEventService() { - } public List Parser(string xml) @@ -22,10 +21,10 @@ public List Parser(string xml) XmlReader reader = XmlReader.Create(new StringReader(xml), settings); XmlDocument xmlDocument = new XmlDocument(); - //Read the XML File + //Read the XML File xmlDocument.Load(reader); - //Create a XML Node List with XPath Expression + //Create a XML Node List with XPath Expression XmlNodeList? eventNodeList = xmlDocument.SelectNodes("/RingBufferTarget/event"); if (eventNodeList == null) diff --git a/src/LightQueryProfiler.WinFormsApp/Data/SqlHighlightService.cs b/src/LightQueryProfiler.WinFormsApp/Data/SqlHighlightService.cs index 7426718..927c1d3 100644 --- a/src/LightQueryProfiler.WinFormsApp/Data/SqlHighlightService.cs +++ b/src/LightQueryProfiler.WinFormsApp/Data/SqlHighlightService.cs @@ -7,6 +7,7 @@ public class SqlHighlightService { private readonly IConfiguration _configuration; private readonly IEngine _engine; + public SqlHighlightService(IEngine engine, IConfiguration configuration) { _engine = engine; diff --git a/src/LightQueryProfiler.WinFormsApp/Presenters/MainPresenter.cs b/src/LightQueryProfiler.WinFormsApp/Presenters/MainPresenter.cs index c8e7c39..7ad2503 100644 --- a/src/LightQueryProfiler.WinFormsApp/Presenters/MainPresenter.cs +++ b/src/LightQueryProfiler.WinFormsApp/Presenters/MainPresenter.cs @@ -404,6 +404,7 @@ private void OnRecentConnectionsClick(object? sender, EventArgs e) } } } + private void OnResume(object? sender, EventArgs e) { _shouldStop = false; @@ -454,7 +455,6 @@ private void OnNextSearch(object? sender, EventArgs e) MessageBox.Show(exc.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); ShowButtonsByAction("default"); } - } private void OnStart(object? sender, EventArgs e) diff --git a/src/LightQueryProfiler.WinFormsApp/Presenters/RecentConnectionsPresenter.cs b/src/LightQueryProfiler.WinFormsApp/Presenters/RecentConnectionsPresenter.cs index 333831f..01f410b 100644 --- a/src/LightQueryProfiler.WinFormsApp/Presenters/RecentConnectionsPresenter.cs +++ b/src/LightQueryProfiler.WinFormsApp/Presenters/RecentConnectionsPresenter.cs @@ -59,7 +59,6 @@ private void SetConnection(Connection? connection) } } - private async void View_OnTextChangeAsync(object? sender, EventArgs e) { await SearchGridValueAsync(view.SearchValue?.Trim() ?? ""); @@ -145,4 +144,4 @@ private DataTable GetDataTable(List connections) return table; } } -} +} \ No newline at end of file diff --git a/src/LightQueryProfiler.WinFormsApp/Program.cs b/src/LightQueryProfiler.WinFormsApp/Program.cs index 90db50e..49ab29a 100644 --- a/src/LightQueryProfiler.WinFormsApp/Program.cs +++ b/src/LightQueryProfiler.WinFormsApp/Program.cs @@ -14,7 +14,7 @@ private static void Main() Application.EnableVisualStyles(); // Optional: Improve text rendering Application.SetCompatibleTextRenderingDefault(false); - + Application.SetHighDpiMode(HighDpiMode.SystemAware); // To customize application configuration such as set high DPI settings or default font, diff --git a/src/LightQueryProfiler.WinFormsApp/Views/AboutView.cs b/src/LightQueryProfiler.WinFormsApp/Views/AboutView.cs index 4605691..5f26c7c 100644 --- a/src/LightQueryProfiler.WinFormsApp/Views/AboutView.cs +++ b/src/LightQueryProfiler.WinFormsApp/Views/AboutView.cs @@ -32,6 +32,7 @@ private void CreateEventHandlers() lkbLicense.Click += LkbLicense_Click; btnOK.Click += BtnOK_Click; } + private void LkbIcons_Click(object? sender, EventArgs e) { OnIconLicenseLinkClick?.Invoke(this, EventArgs.Empty); diff --git a/src/LightQueryProfiler.WinFormsApp/Views/IAboutView.cs b/src/LightQueryProfiler.WinFormsApp/Views/IAboutView.cs index 233fd2d..03fab3d 100644 --- a/src/LightQueryProfiler.WinFormsApp/Views/IAboutView.cs +++ b/src/LightQueryProfiler.WinFormsApp/Views/IAboutView.cs @@ -7,6 +7,7 @@ public interface IAboutView event EventHandler? OnLicenseLinkClick; event EventHandler? OnOK; + Form Form { get; } string Version { get; set; } diff --git a/src/LightQueryProfiler.WinFormsApp/Views/IMainView.cs b/src/LightQueryProfiler.WinFormsApp/Views/IMainView.cs index ec295d8..c61bc66 100644 --- a/src/LightQueryProfiler.WinFormsApp/Views/IMainView.cs +++ b/src/LightQueryProfiler.WinFormsApp/Views/IMainView.cs @@ -13,7 +13,9 @@ public interface IMainView event EventHandler OnPause; event EventHandler OnResume; + event EventHandler OnClearSearch; + event EventHandler OnFindNext; event EventHandler OnStart; @@ -46,6 +48,7 @@ public interface IMainView ToolStripButton StopButton { get; } string? User { get; set; } ToolStripTextBox UserTextBox { get; } + void Show(); } } \ No newline at end of file diff --git a/src/LightQueryProfiler.WinFormsApp/Views/IRecentConnectionsView.cs b/src/LightQueryProfiler.WinFormsApp/Views/IRecentConnectionsView.cs index fb51128..e77dae8 100644 --- a/src/LightQueryProfiler.WinFormsApp/Views/IRecentConnectionsView.cs +++ b/src/LightQueryProfiler.WinFormsApp/Views/IRecentConnectionsView.cs @@ -1,7 +1,4 @@ - -using LightQueryProfiler.Shared.Models; - -namespace LightQueryProfiler.WinFormsApp.Views +namespace LightQueryProfiler.WinFormsApp.Views { public interface IRecentConnectionsView { @@ -19,4 +16,4 @@ public interface IRecentConnectionsView Form Form { get; } } -} +} \ No newline at end of file diff --git a/src/LightQueryProfiler.WinFormsApp/Views/MainView.cs b/src/LightQueryProfiler.WinFormsApp/Views/MainView.cs index 03493d4..f410e2f 100644 --- a/src/LightQueryProfiler.WinFormsApp/Views/MainView.cs +++ b/src/LightQueryProfiler.WinFormsApp/Views/MainView.cs @@ -57,7 +57,6 @@ public partial class MainView : Form, IMainView private ToolStripTextBox tstUser = new ToolStripTextBox(); - public MainView() { InitializeComponent(); @@ -78,14 +77,15 @@ public MainView() public event EventHandler? OnResume; public event EventHandler? OnClearSearch; - public event EventHandler? OnFindNext; + public event EventHandler? OnFindNext; public event EventHandler? OnStart; public event EventHandler? OnStop; public event EventHandler? RowEnter; + ToolStripComboBox IMainView.AuthenticationComboBox => tscAuthentication; IList IMainView.AuthenticationModes @@ -111,7 +111,6 @@ IList IMainView.AuthenticationModes ToolStripButton IMainView.ClearSearchButton => tsbClearSearch; ToolStripButton IMainView.FindNextButton => tsbFindNext; - string? IMainView.SearchValue { get => tstSearch.Text; set => tstSearch.Text = value; } object? IMainView.SelectedAuthenticationMode @@ -422,6 +421,7 @@ private void SelectConnectionMenu_Click(object? sender, EventArgs e) { OnRecentConnectionsClick?.Invoke(this, EventArgs.Empty); } + private void SetupDgvEvents() { dgvEvents.ReadOnly = true; diff --git a/src/LightQueryProfiler.WinFormsApp/Views/RecentConnectionsView.cs b/src/LightQueryProfiler.WinFormsApp/Views/RecentConnectionsView.cs index 55c369c..9bfd56a 100644 --- a/src/LightQueryProfiler.WinFormsApp/Views/RecentConnectionsView.cs +++ b/src/LightQueryProfiler.WinFormsApp/Views/RecentConnectionsView.cs @@ -1,6 +1,4 @@ -using LightQueryProfiler.Shared.Models; - -namespace LightQueryProfiler.WinFormsApp.Views +namespace LightQueryProfiler.WinFormsApp.Views { public partial class RecentConnectionsView : Form, IRecentConnectionsView { @@ -52,4 +50,4 @@ private void RecentConnectionsView_Load(object? sender, EventArgs e) OnFormLoad?.Invoke(this, EventArgs.Empty); } } -} +} \ No newline at end of file