Skip to content

Commit

Permalink
Add dynamic columns at run time based on AdditionalInformation Proper…
Browse files Browse the repository at this point in the history
…ty of AnalogyLogMessage. Fix #206
  • Loading branch information
LiorBanai committed Jul 2, 2020
1 parent 5cfa47f commit 8249bd1
Show file tree
Hide file tree
Showing 5 changed files with 151 additions and 31 deletions.
6 changes: 3 additions & 3 deletions Analogy/Analogy.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@
<Product>Analogy Log Viewer</Product>
<Description>Modern Log Viewer and analyzer.</Description>
<Copyright>Copyright @ Lior Banai 2020</Copyright>
<AssemblyVersion>4.2.2.0</AssemblyVersion>
<FileVersion>4.2.2.0</FileVersion>
<AssemblyVersion>4.2.3.0</AssemblyVersion>
<FileVersion>4.2.3.0</FileVersion>
<NoWarn>1591;1573;0419;1607</NoWarn>
<PlatformToolset>v120</PlatformToolset>
<BaseAddress>285212672</BaseAddress>
Expand Down Expand Up @@ -80,7 +80,7 @@
<PropertyGroup>
<PreBuildEvent />
<PostBuildEvent />
<Version>4.2.2</Version>
<Version>4.2.3</Version>
<RepositoryUrl>https://github.com/Analogy-LogViewer/Analogy.LogViewer</RepositoryUrl>
<PackageIcon>icon.png</PackageIcon>
<PackageIconUrl />
Expand Down
1 change: 1 addition & 0 deletions Analogy/CommonChangeLog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ public static IEnumerable<AnalogyChangeLog> GetChangeLog()
{
return new List<AnalogyChangeLog>
{
new AnalogyChangeLog( "Add dynamic columns at run time based on AdditionalInformation Property of AnalogyLogMessage. #206",AnalogChangeLogType.Improvement,"Lior Banai", new DateTime(2020, 07, 02)),
new AnalogyChangeLog( "Add multi select of rows. #204",AnalogChangeLogType.Improvement,"Lior Banai", new DateTime(2020, 06, 28)),
new AnalogyChangeLog( "Enable version check on startup. #200",AnalogChangeLogType.Improvement,"Lior Banai", new DateTime(2020, 06, 26)),
new AnalogyChangeLog( "Ribbon Icons are not correct for real time data sources. #199",AnalogChangeLogType.Bug,"Lior Banai", new DateTime(2020, 06, 26)),
Expand Down
90 changes: 68 additions & 22 deletions Analogy/Managers/PagingManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,17 @@
using System.Data;
using System.Linq;
using System.Threading;
using System.Windows.Forms;
using Analogy.Interfaces;
using Analogy.Types;

namespace Analogy
{
public class PagingManager
{
public List<string> CurrentColumns { get; set; }
private static ManualResetEvent columnAdderSync = new ManualResetEvent(false);
public ReaderWriterLockSlim columnsLockSlim = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
private readonly UCLogs owner;
public event EventHandler<AnalogyClearedHistoryEventArgs> OnHistoryCleared;
public event EventHandler<AnalogyPagingChanged> OnPageChanged;
Expand Down Expand Up @@ -40,10 +44,16 @@ public int TotalPages

public PagingManager(UCLogs owner)
{
CurrentColumns = new List<string>();
this.owner = owner;
pageSize = Settings.PagingEnabled ? Settings.PagingSize : int.MaxValue;
pages = new List<DataTable>();

currentTable = Utils.DataTableConstructor();
foreach (DataColumn column in currentTable.Columns)
{
CurrentColumns.Add(column.ColumnName);
}
pages.Add(currentTable);
currentPageNumber = 1;
allMessages = new List<AnalogyLogMessage>();
Expand Down Expand Up @@ -85,7 +95,7 @@ public void ClearLogs()

public DataRow AppendMessage(AnalogyLogMessage message, string dataSource)
{

AddExtraColumnsIfNeeded(currentTable,message);
var table = pages.Last();
allMessages.Add(message);
if (table.Rows.Count + 1 > pageSize)
Expand All @@ -98,7 +108,7 @@ public DataRow AppendMessage(AnalogyLogMessage message, string dataSource)
try
{
lockSlim.EnterWriteLock();
DataRow dtr = Utils.CreateRow(table, message,dataSource);
DataRow dtr = Utils.CreateRow(table, message, dataSource);
table.Rows.Add(dtr);
return dtr;

Expand All @@ -114,38 +124,74 @@ public DataRow AppendMessage(AnalogyLogMessage message, string dataSource)
var table = pages.Last();
var countInsideTable = table.Rows.Count;
List<(DataRow row, AnalogyLogMessage message)> rows = new List<(DataRow row, AnalogyLogMessage message)>(messages.Count);
try
foreach (var message in messages)
{
lockSlim.EnterWriteLock();
foreach (var message in messages)
AddExtraColumnsIfNeeded(currentTable,message);
if (message.Level == AnalogyLogLevel.Disabled)
continue; //ignore those messages
allMessages.Add(message);
if (countInsideTable + 1 > pageSize)
{
if (message.Level == AnalogyLogLevel.Disabled)
continue; //ignore those messages
allMessages.Add(message);
if (countInsideTable + 1 > pageSize)
{
table = Utils.DataTableConstructor();
pages.Add(table);
countInsideTable = 0;
var pageStartRowIndex = (pages.Count - 1) * pageSize;
OnPageChanged?.Invoke(this, new AnalogyPagingChanged(new AnalogyPageInformation(table, pages.Count, pageStartRowIndex)));
}
table = Utils.DataTableConstructor();
pages.Add(table);
countInsideTable = 0;
var pageStartRowIndex = (pages.Count - 1) * pageSize;
OnPageChanged?.Invoke(this, new AnalogyPagingChanged(new AnalogyPageInformation(table, pages.Count, pageStartRowIndex)));
}

countInsideTable++;
countInsideTable++;
try
{
lockSlim.EnterWriteLock();
DataRow dtr = Utils.CreateRow(table, message, dataSource);
table.Rows.Add(dtr);
rows.Add((dtr, message));
}
finally
{
lockSlim.ExitWriteLock();
}

}
finally
{
lockSlim.ExitWriteLock();
}

return rows;
}

private void AddExtraColumnsIfNeeded(DataTable table, AnalogyLogMessage message)
{
if (message.AdditionalInformation != null)
{
foreach (KeyValuePair<string, string> info in message.AdditionalInformation)
{

if (!CurrentColumns.Contains(info.Key))
{
columnsLockSlim.EnterWriteLock();
if (!CurrentColumns.Contains(info.Key))
{
if (!owner.InvokeRequired)
{
CurrentColumns.Add(info.Key);
table.Columns.Add(info.Key);
}
else
{
owner.BeginInvoke(new MethodInvoker(() =>
{
CurrentColumns.Add(info.Key);
table.Columns.Add(info.Key);
columnAdderSync.Set();

}));
columnAdderSync.WaitOne();
columnAdderSync.Reset();

}
}
columnsLockSlim.ExitWriteLock();
}
}
}
}

public AnalogyPageInformation NextPage()
{
Expand Down
73 changes: 67 additions & 6 deletions Analogy/UserControls/UCLogs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ public partial class UCLogs : XtraUserControl, ILogMessageCreatedHandler, ILogWi
public bool DoNotAddToRecentHistory { get; set; } = false;
private PagingManager PagingManager { get; set; }
private FileProcessor fileProcessor { get; set; }

ManualResetEvent columnAdderSync = new ManualResetEvent(false);
public List<string> CurrentColumns { get; set; }
public CancellationTokenSource CancellationTokenSource { get; set; } = new CancellationTokenSource();
public event EventHandler<bool> FullMode;
public event EventHandler<AnalogyClearedHistoryEventArgs> OnHistoryCleared;
Expand Down Expand Up @@ -125,6 +126,7 @@ public UCLogs()
PagingManager = new PagingManager(this);
lockSlim = PagingManager.lockSlim;
_messageData = PagingManager.CurrentPage();
CurrentColumns = logGrid.Columns.Select(c => c.FieldName).ToList();
SetupEventsHandlers();
}

Expand Down Expand Up @@ -983,7 +985,6 @@ public void AppendMessage(AnalogyLogMessage message, string dataSource)
{
PagingManager.IncrementTotalMissedMessages();
}
lockSlim.EnterWriteLock();
if (ExternalWindowsCount > 0)
{
foreach (XtraFormLogGrid grid in ExternalWindows)
Expand All @@ -994,11 +995,34 @@ public void AppendMessage(AnalogyLogMessage message, string dataSource)


DataRow dtr = PagingManager.AppendMessage(message, dataSource);
lockSlim.EnterWriteLock();
if (diffStartTime > DateTime.MinValue)
{
dtr["TimeDiff"] = message.Date.Subtract(diffStartTime).ToString();
}
lockSlim.ExitWriteLock();
if (message.AdditionalInformation != null)
{
foreach (KeyValuePair<string, string> info in message.AdditionalInformation)
{
if (!CurrentColumns.Contains(info.Key))
{
BeginInvoke(new MethodInvoker(() =>
{
if (!logGrid.Columns.Select(g => g.FieldName).Contains(info.Key))
logGrid.Columns.Add(new GridColumn() { Caption = info.Key, FieldName = info.Key, Name = info.Key, Visible = true });
CurrentColumns.Add(info.Key);
columnAdderSync.Set();

}));
columnAdderSync.WaitOne();
columnAdderSync.Reset();
}

}

}
lockSlim.EnterWriteLock();
if (hasAnyInPlaceExtensions)
{
foreach (IAnalogyExtension extension in InPlaceRegisteredExtensions)
Expand Down Expand Up @@ -1407,8 +1431,9 @@ private void CreateBookmark(bool persists)
int[] selRows = LogGrid.GetSelectedRows();
if (message == null) return;
lockSlim.EnterWriteLock();
string dataSource = (string) LogGrid.GetRowCellValue(selRows.First(), "DataProvider") ?? string.Empty;
DataRow dtr = Utils.CreateRow(_bookmarkedMessages, message,dataSource);
string dataSource = (string)LogGrid.GetRowCellValue(selRows.First(), "DataProvider") ?? string.Empty;
AddExtraColumnsIfNeededToBookmark(message);
DataRow dtr = Utils.CreateRow(_bookmarkedMessages, message, dataSource);
if (diffStartTime > DateTime.MinValue)
{
dtr["TimeDiff"] = message.Date.Subtract(diffStartTime).ToString();
Expand All @@ -1424,6 +1449,42 @@ private void CreateBookmark(bool persists)
lockSlim.ExitWriteLock();
}

private void AddExtraColumnsIfNeededToBookmark(AnalogyLogMessage message)
{
if (message.AdditionalInformation != null)
{
foreach (KeyValuePair<string, string> info in message.AdditionalInformation)
{
if (!_bookmarkedMessages.Columns.Contains(info.Key))
{

if (!InvokeRequired)
{

if (!gridViewBookmarkedMessages.Columns.Select(g => g.FieldName).Contains(info.Key))
gridViewBookmarkedMessages.Columns.Add(new GridColumn() { Caption = info.Key, FieldName = info.Key, Name = info.Key, Visible = true });
_bookmarkedMessages.Columns.Add(info.Key);
}
else
{
BeginInvoke(new MethodInvoker(() =>
{
if (!gridViewBookmarkedMessages.Columns.Select(g => g.FieldName).Contains(info.Key))
gridViewBookmarkedMessages.Columns.Add(new GridColumn() { Caption = info.Key, FieldName = info.Key, Name = info.Key, Visible = true });
_bookmarkedMessages.Columns.Add(info.Key);
columnAdderSync.Set();
}));
columnAdderSync.WaitOne();
columnAdderSync.Reset();

}
}
}
}


}

private void GoToMessage()
{
int[] selRows = gridViewBookmarkedMessages.GetSelectedRows();
Expand Down Expand Up @@ -1868,7 +1929,7 @@ private void gridViewGrouping_FocusedRowChanged(object sender, FocusedRowChanged
var messages = groupingByChars[key];
foreach (var message in messages)
{

AddExtraColumnsIfNeededToBookmark(message);
DataRow dtr = Utils.CreateRow(grouped, message, "");
if (diffStartTime > DateTime.MinValue)
{
Expand Down Expand Up @@ -2194,7 +2255,7 @@ private void sbtnIncludeSources_Click(object sender, EventArgs e)
{
txtbSource.Text = "";
}

private void sbtnIncludeModules_Click(object sender, EventArgs e)
{
txtbModule.Text = "";
Expand Down
12 changes: 12 additions & 0 deletions Analogy/Utils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

Expand Down Expand Up @@ -65,6 +66,8 @@ private struct LASTINPUTINFO
private static Regex IllegalCharactersRegex = new Regex("[" + @"\/:<>|" + "\"]", RegexOptions.Compiled);
private static Regex CatchExtentionRegex = new Regex(@"^\s*.+\.([^\.]+)\s*$", RegexOptions.Compiled);
private static string NonDotCharacters = @"[^.]*";


//
/// <summary>
///
Expand Down Expand Up @@ -277,6 +280,7 @@ public static Regex Convert(string pattern)
}
}


[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static DataRow CreateRow(DataTable table, AnalogyLogMessage message, string dataSource)
{
Expand All @@ -295,6 +299,14 @@ public static DataRow CreateRow(DataTable table, AnalogyLogMessage message, stri
dtr["ThreadID"] = message.ThreadId;
dtr["DataProvider"] = dataSource ?? string.Empty;
dtr["MachineName"] = message.MachineName ?? string.Empty;
if (message.AdditionalInformation != null)
{
foreach (KeyValuePair<string, string> info in message.AdditionalInformation)
{
dtr[info.Key] = info.Value;
}

}
return dtr;
}
}
Expand Down

0 comments on commit 8249bd1

Please sign in to comment.