Skip to content

Commit 1968187

Browse files
committed
Updating Setting UI
1 parent 55b8ee8 commit 1968187

File tree

11 files changed

+535
-486
lines changed

11 files changed

+535
-486
lines changed

Application/FormEditSettings.Designer.cs

Lines changed: 290 additions & 291 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Application/FormEditSettings.cs

Lines changed: 58 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ namespace CsvTools
2828
/// </summary>
2929
public partial class FormEditSettings : ResizeForm
3030
{
31+
private readonly CancellationTokenSource m_CancellationTokenSource = new CancellationTokenSource();
3132
private readonly ViewSettings m_ViewSettings;
3233

3334
/// <summary>
@@ -83,7 +84,25 @@ private async void ButtonGuessDelimiter_ClickAsync(object sender, EventArgs e)
8384
Cursor.Current = Cursors.WaitCursor;
8485
try
8586
{
86-
m_ViewSettings.FileFormat.FieldDelimiter = await CsvHelper.GuessDelimiterAsync(m_ViewSettings, CancellationToken.None);
87+
m_ViewSettings.FileFormat.FieldDelimiter = await CsvHelper.GuessDelimiterAsync(m_ViewSettings, m_CancellationTokenSource.Token);
88+
}
89+
finally
90+
{
91+
Cursor.Current = oldCursor;
92+
}
93+
}
94+
95+
private async void ButtonGuessTextQualifier_Click(object sender, EventArgs e)
96+
{
97+
var oldCursor = Cursor.Current == Cursors.WaitCursor ? Cursors.WaitCursor : Cursors.Default;
98+
Cursor.Current = Cursors.WaitCursor;
99+
try
100+
{
101+
var qualifier = await CsvHelper.GuessQualifierAsync(m_ViewSettings, m_CancellationTokenSource.Token);
102+
if (qualifier != null)
103+
m_ViewSettings.FileFormat.FieldQualifier = qualifier;
104+
else
105+
_MessageBox.Show(this, "No Column Qualifier found", "Qualifier", MessageBoxButtons.OK, MessageBoxIcon.Information);
87106
}
88107
finally
89108
{
@@ -97,7 +116,7 @@ private async void ButtonSkipLine_ClickAsync(object sender, EventArgs e)
97116
Cursor.Current = Cursors.WaitCursor;
98117
try
99118
{
100-
m_ViewSettings.SkipRows = await CsvHelper.GuessStartRowAsync(m_ViewSettings, CancellationToken.None);
119+
m_ViewSettings.SkipRows = await CsvHelper.GuessStartRowAsync(m_ViewSettings, m_CancellationTokenSource.Token);
101120
}
102121
finally
103122
{
@@ -108,7 +127,14 @@ private async void ButtonSkipLine_ClickAsync(object sender, EventArgs e)
108127
private void CboCodePage_SelectedIndexChanged(object sender, EventArgs e)
109128
{
110129
if (cboCodePage.SelectedItem != null)
111-
m_ViewSettings.CodePageId = ((DisplayItem<int>)cboCodePage.SelectedItem).ID;
130+
m_ViewSettings.CodePageId = ((DisplayItem<int>) cboCodePage.SelectedItem).ID;
131+
}
132+
133+
private void CboRecordDelimiter_SelectedIndexChanged(object sender, EventArgs e)
134+
135+
{
136+
if (cboRecordDelimiter.SelectedItem != null)
137+
m_ViewSettings.FileFormat.NewLine = (RecordDelimiterType) cboRecordDelimiter.SelectedValue;
112138
}
113139

114140
private async Task ChangeFileNameAsync(string newFileName)
@@ -146,7 +172,7 @@ private async Task ChangeFileNameAsync(string newFileName)
146172
m_ViewSettings.ColumnCollection.Clear();
147173
try
148174
{
149-
using (var processDisplay = m_ViewSettings.GetProcessDisplay(this, true, CancellationToken.None))
175+
using (var processDisplay = m_ViewSettings.GetProcessDisplay(this, true, m_CancellationTokenSource.Token))
150176
{
151177
await m_ViewSettings.FillGuessColumnFormatReaderAsync(
152178
false,
@@ -169,12 +195,18 @@ await m_ViewSettings.FillGuessColumnFormatReaderAsync(
169195
}
170196
}
171197

198+
private void CheckBoxColumnsProcess_CheckedChanged(object sender, EventArgs e)
199+
{
200+
if (m_ViewSettings.TryToSolveMoreColumns || m_ViewSettings.AllowRowCombining)
201+
m_ViewSettings.WarnEmptyTailingColumns = true;
202+
}
203+
172204
private void CsvFile_PropertyChanged(object sender, PropertyChangedEventArgs e)
173205
{
174206
if (e.PropertyName == nameof(ViewSettings.CodePageId))
175207
{
176208
foreach (var ite in cboCodePage.Items)
177-
if (((DisplayItem<int>)ite).ID == m_ViewSettings.CodePageId)
209+
if (((DisplayItem<int>) ite).ID == m_ViewSettings.CodePageId)
178210
{
179211
cboCodePage.SelectedItem = ite;
180212
break;
@@ -201,10 +233,10 @@ private void EditSettings_Load(object sender, EventArgs e)
201233
var descConv = new EnumDescriptionConverter(typeof(RecordDelimiterType));
202234
foreach (RecordDelimiterType item in Enum.GetValues(typeof(RecordDelimiterType)))
203235
{
204-
di.Add(new DisplayItem<int>((int)item, descConv.ConvertToString(item)));
236+
di.Add(new DisplayItem<int>((int) item, descConv.ConvertToString(item)));
205237
}
206238

207-
var selValue = (int)m_ViewSettings.FileFormat.NewLine;
239+
var selValue = (int) m_ViewSettings.FileFormat.NewLine;
208240
cboRecordDelimiter.DataSource = di;
209241
cboRecordDelimiter.DisplayMember = nameof(DisplayItem<int>.Display);
210242
cboRecordDelimiter.ValueMember = nameof(DisplayItem<int>.ID);
@@ -215,7 +247,25 @@ private void EditSettings_Load(object sender, EventArgs e)
215247
CsvFile_PropertyChanged(null, new PropertyChangedEventArgs(nameof(ViewSettings.CodePageId)));
216248
}
217249

218-
private void FormEditSettings_FormClosing(object sender, FormClosingEventArgs e) => ValidateChildren();
250+
private void FormEditSettings_FormClosing(object sender, FormClosingEventArgs e)
251+
{
252+
m_CancellationTokenSource.Cancel();
253+
ValidateChildren();
254+
}
255+
256+
private async void GuessNewline_Click(object sender, EventArgs e)
257+
{
258+
var oldCursor = Cursor.Current == Cursors.WaitCursor ? Cursors.WaitCursor : Cursors.Default;
259+
Cursor.Current = Cursors.WaitCursor;
260+
try
261+
{
262+
m_ViewSettings.FileFormat.NewLine = await CsvHelper.GuessNewlineAsync(m_ViewSettings, m_CancellationTokenSource.Token);
263+
}
264+
finally
265+
{
266+
Cursor.Current = oldCursor;
267+
}
268+
}
219269

220270
private void PositiveNumberValidating(object sender, CancelEventArgs e)
221271
{
@@ -266,32 +316,5 @@ private void TextBoxFile_Validating(object sender, CancelEventArgs e)
266316
errorProvider.SetError(textBoxFile, string.Empty);
267317
}
268318
}
269-
270-
private async void GuessNewline_Click(object sender, EventArgs e)
271-
{
272-
var oldCursor = Cursor.Current == Cursors.WaitCursor ? Cursors.WaitCursor : Cursors.Default;
273-
Cursor.Current = Cursors.WaitCursor;
274-
try
275-
{
276-
m_ViewSettings.FileFormat.NewLine = await CsvHelper.GuessNewlineAsync(m_ViewSettings, CancellationToken.None);
277-
}
278-
finally
279-
{
280-
Cursor.Current = oldCursor;
281-
}
282-
}
283-
284-
private void CboRecordDelimiter_SelectedIndexChanged(object sender, EventArgs e)
285-
286-
{
287-
if (cboRecordDelimiter.SelectedItem != null)
288-
m_ViewSettings.FileFormat.NewLine = (RecordDelimiterType)cboRecordDelimiter.SelectedValue;
289-
}
290-
291-
private void CheckBoxColumnsProcess_CheckedChanged(object sender, EventArgs e)
292-
{
293-
if (m_ViewSettings.TryToSolveMoreColumns || m_ViewSettings.AllowRowCombining)
294-
m_ViewSettings.WarnEmptyTailingColumns = true;
295-
}
296319
}
297320
}

Application/FormEditSettings.resx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,18 +123,24 @@
123123
<metadata name="fileFormatBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
124124
<value>202, 17</value>
125125
</metadata>
126+
<metadata name="fileFormatBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
127+
<value>202, 17</value>
128+
</metadata>
129+
<metadata name="fileSettingBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
130+
<value>12, 17</value>
131+
</metadata>
126132
<metadata name="fileSettingBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
127133
<value>12, 17</value>
128134
</metadata>
129135
<metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
130136
<value>387, 17</value>
131137
</metadata>
132-
<metadata name="tableLayoutPanelAdvanced.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
133-
<value>False</value>
134-
</metadata>
135138
<metadata name="tableLayoutPanelBehavior.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
136139
<value>False</value>
137140
</metadata>
141+
<metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
142+
<value>387, 17</value>
143+
</metadata>
138144
<data name="checkBoxTryToSolveMoreColumns.ToolTip" xml:space="preserve">
139145
<value>Try to realign columns in case the file is not quoted, and an extra delimiter has caused additional columns.
140146
Re-Aligning works best if columns and their order are easily identifiable, if the columns are very similar e.g. all are text, or all are empty there is a high chance the realignment does fail.

Library/ClassLibraryCSV/CsvHelper.cs

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,26 @@ public static async Task<bool> GuessJsonFileAsync(IFileSettingPhysicalFile setti
195195
}
196196
}
197197

198+
/// <summary>
199+
/// Try to guess the new line sequence
200+
/// </summary>
201+
/// <param name="setting"><see cref="ICsvFile" /> with the information</param>
202+
/// <param name="cancellationToken">A cancellation token</param>
203+
/// <returns>The NewLine Combination used</returns>
204+
public static async Task<string> GuessQualifierAsync(ICsvFile setting,
205+
CancellationToken cancellationToken)
206+
{
207+
Contract.Requires(setting != null);
208+
using (var improvedStream = FunctionalDI.OpenRead(setting))
209+
using (var streamReader = new ImprovedTextReader(improvedStream, setting.CodePageId, setting.SkipRows))
210+
{
211+
var qualifier = await GuessQualifierAsync(streamReader, setting.FileFormat.FieldDelimiterChar, cancellationToken);
212+
if (qualifier != '\0')
213+
return char.ToString(qualifier);
214+
}
215+
return null;
216+
}
217+
198218
/// <summary>
199219
/// Try to guess the new line sequence
200220
/// </summary>
@@ -398,7 +418,8 @@ public static async Task RefreshCsvFileAsync(
398418
if (display.CancellationToken.IsCancellationRequested)
399419
return;
400420
display.SetProcess("Checking Qualifier", -1, true);
401-
var qualifier = await GuessQualifierAsync(textReader, setting.FileFormat.FieldDelimiterChar);
421+
var qualifier = await GuessQualifierAsync(textReader, setting.FileFormat.FieldDelimiterChar,
422+
display.CancellationToken);
402423
if (qualifier != '\0')
403424
setting.FileFormat.FieldQualifier = char.ToString(qualifier);
404425
display.SetProcess("Qualifier: " + setting.FileFormat.FieldQualifier, -1, true);
@@ -630,7 +651,7 @@ private static async Task<RecordDelimiterType> GuessNewlineAsync(ImprovedTextRea
630651
const int c_RecSep = 4;
631652
const int c_UnitSep = 5;
632653

633-
int[] count = {0, 0, 0, 0, 0, 0};
654+
int[] count = { 0, 0, 0, 0, 0, 0 };
634655

635656
// \r = CR (Carriage Return) \n = LF (Line Feed)
636657

@@ -711,19 +732,19 @@ private static async Task<RecordDelimiterType> GuessNewlineAsync(ImprovedTextRea
711732
: RecordDelimiterType.None;
712733
}
713734

714-
private static async Task<char> GuessQualifierAsync(ImprovedTextReader textReader, char delimiter)
735+
private static async Task<char> GuessQualifierAsync(ImprovedTextReader textReader, char delimiter, CancellationToken cancellationToken)
715736
{
716737
if (textReader == null)
717738
return '\0';
718739

719740
const int c_MaxLine = 30;
720-
var possibleQuotes = new[] {'"', '\''};
741+
var possibleQuotes = new[] { '"', '\'' };
721742
var counter = new int[possibleQuotes.Length];
722743

723744
var textReaderPosition = new ImprovedTextReaderPositionStore(textReader);
724745
var max = 0;
725746
// skip the first line it usually a header
726-
for (var lineNo = 0; lineNo < c_MaxLine && !textReaderPosition.AllRead; lineNo++)
747+
for (var lineNo = 0; lineNo < c_MaxLine && !textReaderPosition.AllRead && !cancellationToken.IsCancellationRequested; lineNo++)
727748
{
728749
var line = await textReader.ReadLineAsync();
729750
// EOF

0 commit comments

Comments
 (0)