HamBook – Blame information for rev 59

Subversion Repositories:
Rev:
Rev Author Line No. Line
54 office 1 using System;
2 using System.Collections.Concurrent;
3 using System.Collections.Generic;
4 using System.ComponentModel;
5 using System.Drawing;
6 using System.Linq;
7 using System.Threading;
8 using System.Threading.Tasks;
9 using System.Windows.Forms;
10 using HamBook.Properties;
11 using HamBook.Radios;
12 using HamBook.Radios.Generic;
56 office 13 using HamBook.Radios.Yaesu.FT_891;
54 office 14 using HamBook.Utilities;
56 office 15 using HamBook.Utilities.Serialization;
54 office 16 using Serilog;
56 office 17 using static System.Windows.Forms.VisualStyles.VisualStyleElement.ProgressBar;
54 office 18  
19 namespace HamBook
20 {
21 public partial class MenuForm : Form
22 {
23 private static ScheduledContinuation _searchTextBoxChangedContinuation;
56 office 24 private readonly CancellationTokenSource _cancellationTokenSource;
54 office 25  
26 private readonly CatAssemblies _catAssemblies;
56 office 27 private readonly CancellationToken _localCancellationToken;
28 private readonly CancellationTokenSource _localCancellationTokenSource;
54 office 29 private CancellationToken _cancellationToken;
56 office 30 private CancellationTokenSource _readCancellationTokenSource;
54 office 31 private CancellationTokenSource _readLinkedCancellationTokenSource;
32 private Task _readMenuTask;
33 private CancellationTokenSource _writeCancellationTokenSource;
34 private CancellationTokenSource _writeLinkedCancellationTokenSource;
35 private Task _writeMenuTask;
56 office 36 private readonly Radios.Generic.RadioMenu _radioMenu;
54 office 37  
38 public MenuForm()
39 {
40 InitializeComponent();
41  
42 _localCancellationTokenSource = new CancellationTokenSource();
43 _localCancellationToken = _localCancellationTokenSource.Token;
44 }
45  
46 public MenuForm(Configuration.Configuration configuration, CatAssemblies catAssemblies,
47 CancellationToken cancellationToken) : this()
48 {
49 Configuration = configuration;
50 _catAssemblies = catAssemblies;
51 _cancellationToken = cancellationToken;
52  
53 _searchTextBoxChangedContinuation = new ScheduledContinuation();
56 office 54 _radioMenu = Radios.Generic.RadioMenu.Create(Configuration.Radio);
54 office 55  
56 _cancellationTokenSource =
57 CancellationTokenSource.CreateLinkedTokenSource(_localCancellationToken, cancellationToken);
58 _cancellationToken = _cancellationTokenSource.Token;
59 }
60  
61 private Configuration.Configuration Configuration { get; }
62  
63 private void AddMenuItem<T>(string menuIndex, string menuFunction, Func<IEnumerable<T>> values,
64 T defaultValue = default, int index = -1)
65 {
66 if (index == -1) index = dataGridView1.Rows.Add();
67  
68 dataGridView1.Rows[index].Cells["IndexColumn"].Value = menuIndex;
69 dataGridView1.Rows[index].Cells["FunctionColumn"].Value = menuFunction;
70  
71 foreach (var value in values.Invoke())
72 {
73 ((DataGridViewComboBoxCell)dataGridView1.Rows[index].Cells["ValueColumn"]).Items.Add($"{value}");
74 ((DataGridViewComboBoxCell)dataGridView1.Rows[index].Cells["ValueColumn"]).Value = $"{defaultValue}";
75 }
76 }
77  
78 private void MenuForm_Load(object sender, EventArgs e)
79 {
59 office 80 Utilities.WindowState.FormTracker.Track(this);
81  
54 office 82 // Generate columns based on radio type.
83 switch (Configuration.Radio)
84 {
85 case "Yaesu FT-891":
86 dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
87 { Name = "IndexColumn", HeaderText = "Index", ReadOnly = true });
88 dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
89 { Name = "FunctionColumn", HeaderText = "Function", ReadOnly = true });
90 dataGridView1.Columns.Add(new DataGridViewComboBoxColumn
91 { Name = "ValueColumn", HeaderText = "Value" });
92  
93  
94 AddMenuItem("0101", "AGC FAST DELAY", () => { return Mathematics.GenerateRange(20, 4000, 20); },
95 300);
96  
97 AddMenuItem("0102", "AGC MID DELAY", () => { return Mathematics.GenerateRange(20, 4000, 20); },
98 700);
99  
100 AddMenuItem("0103", "AGC SLOW DELAY", () => { return Mathematics.GenerateRange(20, 4000, 20); },
101 3000);
102  
103 AddMenuItem("0201", "LCD CONTRAST", () => { return Mathematics.GenerateRange(1, 15); }, 8);
104  
105 AddMenuItem("0202", "DIMMER BACKLIT", () => { return Mathematics.GenerateRange(1, 15); }, 8);
106  
107 AddMenuItem("0203", "DIMMER LCD", () => { return Mathematics.GenerateRange(1, 15); }, 8);
108  
109 AddMenuItem("0204", "DIMMER TX/BUSY", () => { return Mathematics.GenerateRange(1, 15); }, 8);
110  
111 AddMenuItem("0205", "PEAK HOLD", () => { return new[] { "OFF", "0.5", "1.0", "2.0" }; }, "OFF");
112  
113 AddMenuItem("0206", "ZIN LED", () => { return new[] { "DISABLE", "ENABLE" }; }, "DISABLE");
114  
115 AddMenuItem("0207", "POP-UP MENU", () => { return new[] { "UPPER", "LOWER" }; }, "LOWER");
116  
117 AddMenuItem("0301", "DVS RX OUT LVL", () => { return Mathematics.GenerateRange(0, 100); }, 50);
118  
119 AddMenuItem("0302", "DVS TX OUT LVL", () => { return Mathematics.GenerateRange(0, 100); }, 50);
120  
121 AddMenuItem("0401", "KEYER TYPE",
122 () =>
123 {
124 return new[] { "OFF", "BUG", "ELEKEY-A", "ELEKEY-B", "ELEKEY-Y", "ACS" };
125 }, "ELEKEY-B");
126  
127 AddMenuItem("0402", "KEYER DOT/DASH", () => { return new[] { "NOR", "KEY" }; }, "NOR");
128  
129 AddMenuItem("0403", "CW WEIGHT", () =>
130 {
131 var value = new List<string>();
132 for (var i = 2.0; i <= 4.5; i += 0.1)
133 {
134 var v = $"{(decimal)i:f1}";
135 value.Add(v);
136 }
137  
138 return value;
139 }, "3.0");
140  
141 AddMenuItem("0404", "BEACON INTERVAL",
56 office 142 () =>
143 {
144 return new[] { "OFF" }.Concat(Mathematics.GenerateRange(1, 690).Select(i => i.ToString()));
145 },
54 office 146 "OFF");
147  
148 AddMenuItem("0405", "NUMBER STYLE",
149 () => { return new[] { "1290", "AUNO", "AUNT", "A2NO", "A2NT", "12NO", "12NT" }; }, "1290");
150  
151 AddMenuItem("0406", "CONTEST NUMBER", () => { return Mathematics.GenerateRange(0, 9999); }, 1);
152  
153 AddMenuItem("0407", "CW MEMORY 1", () => { return new[] { "TEXT", "MESSAGE" }; }, "TEXT");
154  
155 AddMenuItem("0408", "CW MEMORY 2", () => { return new[] { "TEXT", "MESSAGE" }; }, "TEXT");
156  
157 AddMenuItem("0409", "CW MEMORY 3", () => { return new[] { "TEXT", "MESSAGE" }; }, "TEXT");
158  
159 AddMenuItem("0410", "CW MEMORY 4", () => { return new[] { "TEXT", "MESSAGE" }; }, "TEXT");
160  
161 AddMenuItem("0411", "CW MEMORY 5", () => { return new[] { "TEXT", "MESSAGE" }; }, "TEXT");
162  
163 AddMenuItem("0501", "NB WIDTH", () => { return new[] { 1, 3, 10 }; }, 3);
164  
165 AddMenuItem("0502", "NB REJECTION", () => { return new[] { 10, 30, 50 }; }, 30);
166  
167 AddMenuItem("0503", "NB LEVEL", () => { return Mathematics.GenerateRange(0, 10); }, 5);
168  
169 AddMenuItem("0504", "BEEP LEVEL", () => { return Mathematics.GenerateRange(0, 100); }, 30);
170  
171 AddMenuItem("0505", "RF/SQL VR", () => { return new[] { "RF", "SQL" }; }, "RF");
172  
173 AddMenuItem("0506", "CAT RATE", () => { return new[] { 4800, 9600, 19200, 38400 }; }, 9600);
174  
175 AddMenuItem("0507", "CAT TOT", () => { return new[] { 10, 100, 1000, 3000 }; }, 1000);
176  
177 AddMenuItem("0508", "CAT RTS", () => { return new[] { "DISABLE", "ENABLE" }; }, "DISABLE");
178  
179 AddMenuItem("0509", "MEM GROUP", () => { return new[] { "DISABLE", "ENABLE" }; }, "DISABLE");
180  
181 AddMenuItem("0510", "FM SETTING", () => { return new[] { "DISABLE", "ENABLE" }; }, "DISABLE");
182  
183 AddMenuItem("0511", "REC SETTING", () => { return new[] { "DISABLE", "ENABLE" }; }, "DISABLE");
184  
185 AddMenuItem("0512", "ATAS SETTING", () => { return new[] { "DISABLE", "ENABLE" }; }, "DISABLE");
186  
187 AddMenuItem("0513", "QUICK SPL FREQ", () => { return Mathematics.GenerateRange(-20, 20); }, 5);
188  
189 AddMenuItem("0514", "TX TOT",
190 () =>
191 {
192 return new[] { "OFF" }.Concat(Mathematics.GenerateRange(1, 30).Select(i => i.ToString()));
193 }, "OFF");
194  
195 AddMenuItem("0515", "MIC SCAN", () => { return new[] { "DISABLE", "ENABLE" }; }, "ENABLE");
196  
197 AddMenuItem("0516", "MIC SCAN RESUME", () => { return new[] { "PAUSE", "TIME" }; }, "TIME");
198  
199 AddMenuItem("0517", "REF FREQ ADJ", () => { return Mathematics.GenerateRange(-25, 25); });
200  
201 AddMenuItem("0518", "CLAR SELECT", () => { return new[] { "RX", "TX", "TRX" }; }, "RX");
202  
203 AddMenuItem("0519", "APO", () => { return new[] { "OFF", "1", "2", "4", "6", "8", "10", "12" }; },
204 "RX");
205  
206 AddMenuItem("0520", "FAN CONTROL", () => { return new[] { "NORMAL", "CONTEST" }; }, "NORMAL");
207  
208 AddMenuItem("0601", "AM LCUT FREQ",
209 () =>
210 {
211 return new[] { "OFF" }.Concat(Mathematics.GenerateRange(100, 1000, 50)
212 .Select(i => i.ToString()));
213 }, "OFF");
214  
215 AddMenuItem("0602", "AM LCUT SLOPE", () => { return new[] { 6, 18 }; }, 6);
216  
217 AddMenuItem("0603", "AM HCUT FREQ",
218 () =>
219 {
220 return new[] { "OFF" }.Concat(Mathematics.GenerateRange(700, 4000, 50)
221 .Select(i => i.ToString()));
222 }, "OFF");
223  
224 AddMenuItem("0604", "AM HCUT SLOPE", () => { return new[] { 6, 18 }; }, 6);
225  
226 AddMenuItem("0605", "AM MIC SELECT", () => { return new[] { "MIC", "REAR" }; }, "MIC");
227  
228 AddMenuItem("0606", "AM OUT LEVEL", () => { return Mathematics.GenerateRange(0, 100); }, 50);
229  
230 AddMenuItem("0607", "AM PTT SELECT", () => { return new[] { "DAKY", "RTS", "DTR" }; }, "DAKY");
231  
232 AddMenuItem("0701", "CW LCUT FREQ",
233 () =>
234 {
235 return new[] { "OFF" }.Concat(Mathematics.GenerateRange(100, 1000, 50)
236 .Select(i => i.ToString()));
237 }, "250");
238  
239 AddMenuItem("0702", "CW LCUT SLOPE", () => { return new[] { 6, 18 }; }, 18);
240  
241 AddMenuItem("0703", "CW HCUT FREQ",
242 () =>
243 {
244 return new[] { "OFF" }.Concat(Mathematics.GenerateRange(700, 4000, 50)
245 .Select(i => i.ToString()));
246 }, "1200");
247  
248 AddMenuItem("0704", "CW HCUT SLOPE", () => { return new[] { 6, 18 }; }, 18);
249  
250 AddMenuItem("0705", "CW OUT LEVEL", () => { return Mathematics.GenerateRange(0, 100); }, 50);
251  
252 AddMenuItem("0706", "CW AUTO MODE", () => { return new[] { "OFF", "50M", "ON" }; }, "OFF");
253  
254 AddMenuItem("0707", "CW BFO", () => { return new[] { "USB", "LSB", "AUTO" }; }, "USB");
255  
256 AddMenuItem("0708", "CW BK-IN TYPE", () => { return new[] { "SEMI", "FULL" }; }, "SEMI");
257  
258 AddMenuItem("0709", "CW BK-IN DELAY", () => { return Mathematics.GenerateRange(30, 3000, 10); },
259 200);
260  
261 AddMenuItem("0710", "CW WAVE SHAPE", () => { return new[] { string.Empty, "2", "4" }; }, "4");
262  
263 AddMenuItem("0711", "CW FREQ DISPLAY", () => { return new[] { "FREQ", "PITCH" }; }, "PITCH");
264  
265 AddMenuItem("0712", "PC KEYING", () => { return new[] { "OFF", "DAKY", "RTS", "DTR" }; }, "OFF");
266  
267 AddMenuItem("0713", "QSK DELAY TIME", () => { return new[] { 15, 20, 25, 30 }; }, 15);
268  
269 AddMenuItem("0801", "DATA MODE", () => { return new[] { "PSK", "OTHERS" }; }, "OTHERS");
270  
271 AddMenuItem("0802", "PSK TONE", () => { return new[] { 1000, 1500, 2000 }; }, 1000);
272  
273 AddMenuItem("0803", "OTHER DISP", () => { return Mathematics.GenerateRange(-3000, 3000, 10); },
274 1000);
275  
276 AddMenuItem("0804", "OTHER SHIFT", () => { return Mathematics.GenerateRange(-3000, 3000, 10); },
277 1500);
278  
279 AddMenuItem("0805", "DATA LCUT FREQ",
280 () =>
281 {
282 return new[] { "OFF" }.Concat(Mathematics.GenerateRange(100, 1000, 50)
283 .Select(i => i.ToString()));
284 }, "OFF");
285  
286 AddMenuItem("0806", "DATA LCUT SLOPE", () => { return new[] { 6, 18 }; }, 18);
287  
288 AddMenuItem("0807", "DATA HCUT FREQ",
289 () =>
290 {
291 return new[] { "OFF" }.Concat(Mathematics.GenerateRange(700, 4000, 50)
292 .Select(i => i.ToString()));
293 }, "OFF");
294  
295 AddMenuItem("0808", "DATA HCUT SLOPE", () => { return new[] { 6, 18 }; }, 18);
296  
297 AddMenuItem("0809", "DATA IN SELECT", () => { return new[] { "MIC", "REAR" }; }, "REAR");
298  
299 AddMenuItem("0810", "DATA PTT SELECT", () => { return new[] { "DAKY", "RTS", "DTR" }; }, "DAKY");
300  
301 AddMenuItem("0811", "DATA OUT LEVEL", () => { return Mathematics.GenerateRange(0, 100); }, 50);
302  
303 AddMenuItem("0812", "DATA BFO", () => { return new[] { "USB", "LSB" }; }, "USB");
304  
305 AddMenuItem("0901", "FM MIC SELECT", () => { return new[] { "MIC", "REAR" }; }, "MIC");
306  
307 AddMenuItem("0902", "FM OUT LEVEL", () => { return Mathematics.GenerateRange(0, 100); }, 50);
308  
309 AddMenuItem("0903", "PKT PTT SELECT", () => { return new[] { "DAKY", "RTS", "DTR" }; }, "DAKY");
310  
311 AddMenuItem("0904", "RPT SHIFT 28MHz", () => { return Mathematics.GenerateRange(0, 1000, 10); },
312 100);
313  
314 AddMenuItem("0905", "RPT SHIFT 50MHz", () => { return Mathematics.GenerateRange(0, 4000, 10); },
315 100);
316  
317 AddMenuItem("0906", "DCS POLARITY",
318 () => { return new[] { "Tn-Rn", "Tn-Riv", "Tiv-Rn", "Tiv-Riv" }; }, "Tn-Rn");
319  
320 AddMenuItem("1001", "RTTY LCUT FREQ",
321 () =>
322 {
323 return new[] { "OFF" }.Concat(Mathematics.GenerateRange(100, 1000, 50)
324 .Select(i => i.ToString()));
325 }, "300");
326  
327 AddMenuItem("1002", "RTTY LCUT SLOPE", () => { return new[] { 6, 18 }; }, 18);
328  
329 AddMenuItem("1003", "RTTY HCUT FREQ",
330 () =>
331 {
332 return new[] { "OFF" }.Concat(Mathematics.GenerateRange(700, 4000, 50)
333 .Select(i => i.ToString()));
334 }, "OFF");
335  
336 AddMenuItem("1004", "RTTY HCUT SLOPE", () => { return new[] { 6, 18 }; }, 18);
337  
338 AddMenuItem("1005", "RTTY SHIFT PORT", () => { return new[] { "SHIFT", "DTR", "RTS" }; }, "SHIFT");
339  
340 AddMenuItem("1006", "RTTY POLARITY-R", () => { return new[] { "NOR", "REV" }; }, "NOR");
341  
342 AddMenuItem("1007", "RTTY POLARITY-T", () => { return new[] { "NOR", "REV" }; }, "NOR");
343  
344 AddMenuItem("1008", "RTTY OUT LEVEL", () => { return Mathematics.GenerateRange(0, 100); }, 50);
345  
346 AddMenuItem("1009", "RTTY SHIFT FREQ", () => { return new[] { 170, 200, 425, 850 }; }, 170);
347  
348 AddMenuItem("1010", "RTTY MARK FREQ", () => { return new[] { 1275, 2125 }; }, 2125);
349  
350 AddMenuItem("1011", "RTTY BFO", () => { return new[] { "USB", "LSB" }; }, "LSB");
351  
352 AddMenuItem("1101", "SSB LCUT FREQ",
353 () =>
354 {
355 return new[] { "OFF" }.Concat(Mathematics.GenerateRange(100, 1000, 50)
356 .Select(i => i.ToString()));
357 }, "100");
358  
359 AddMenuItem("1102", "SSB LCUT SLOPE", () => { return new[] { 6, 18 }; }, 6);
360  
361 AddMenuItem("1103", "SSB HCUT FREQ",
362 () =>
363 {
364 return new[] { "OFF" }.Concat(Mathematics.GenerateRange(700, 4000, 50)
365 .Select(i => i.ToString()));
366 }, "3000");
367  
368 AddMenuItem("1104", "SSB HCUT SLOPE", () => { return new[] { 6, 18 }; }, 6);
369  
370 AddMenuItem("1105", "SSB MIC SELECT", () => { return new[] { "MIC", "REAR" }; }, "REAR");
371  
372 AddMenuItem("1106", "RTTY OUT LEVEL", () => { return Mathematics.GenerateRange(0, 100); }, 50);
373  
374 AddMenuItem("1107", "SSB BFO", () => { return new[] { "USB", "LSB", "AUTO" }; }, "USB");
375  
376 AddMenuItem("1108", "SSB PTT SELECT", () => { return new[] { "DAKY", "RTS", "DTR" }; }, "DAKY");
377  
378 AddMenuItem("1109", "SSB TX BPF",
379 () => { return new[] { "100-3000", "100-2900", "200-2800", "300-2700", "400-2600" }; },
380 "300-2700");
381  
382 AddMenuItem("1201", "APF WIDTH", () => { return new[] { "NARROW", "MEDIUM", "WIDE" }; }, "MEDIUM");
383  
384 AddMenuItem("1202", "CONTOUR LEVEL", () => { return Mathematics.GenerateRange(-40, 20); }, -15);
385  
386 AddMenuItem("1203", "CONTOUR WIDTH", () => { return Mathematics.GenerateRange(1, 11); }, 10);
387  
388 AddMenuItem("1204", "IF NOTCH WIDTH", () => { return new[] { "NARROW", "WIDE" }; }, "WIDE");
389  
390 AddMenuItem("1301", "SCP START CYCLE", () => { return new[] { "OFF", "3", "5", "10" }; }, "OFF");
391  
392 AddMenuItem("1302", "SCP SPAN FREQ", () => { return new[] { 37.5, 75, 150, 375, 750 }; }, 750);
393  
394 AddMenuItem("1401", "QUICK DIAL", () => { return new[] { 50, 100, 500 }; }, 500);
395  
396 AddMenuItem("1402", "SSB DIAL STEP", () => { return new[] { 2, 5, 10 }; }, 10);
397  
398 AddMenuItem("1403", "AM DIAL STEP", () => { return new[] { 10, 100 }; }, 10);
399  
400 AddMenuItem("1404", "FM DIAL STEP", () => { return new[] { 10, 100 }; }, 100);
401  
402 AddMenuItem("1405", "DIAL STEP", () => { return new[] { 2, 5, 10 }; }, 5);
403  
404 AddMenuItem("1406", "AM CH STEP", () => { return new[] { 2.5, 5, 2.9, 10, 12.5, 25 }; }, 5);
405  
406 AddMenuItem("1407", "FM CH STEP", () => { return new[] { 5, 6.25, 10, 12.5, 15, 20, 25 }; }, 5);
407  
408 AddMenuItem("1501", "EQ1 FREQ",
409 () =>
410 {
411 return new[] { "OFF" }.Concat(Mathematics.GenerateRange(100, 700, 100)
412 .Select(i => i.ToString()));
413 }, "OFF");
414  
415 AddMenuItem("1502", "EQ1 LEVEL", () => { return Mathematics.GenerateRange(-20, 10); }, 5);
416  
417 AddMenuItem("1503", "EQ1 BWTH", () => { return Mathematics.GenerateRange(1, 10); }, 10);
418  
419 AddMenuItem("1504", "EQ2 FREQ",
420 () =>
421 {
422 return new[] { "OFF" }.Concat(Mathematics.GenerateRange(700, 1500, 100)
423 .Select(i => i.ToString()));
424 }, "OFF");
425  
426 AddMenuItem("1505", "EQ2 LEVEL", () => { return Mathematics.GenerateRange(-20, 10); }, 5);
427  
428 AddMenuItem("1506", "EQ2 BWTH", () => { return Mathematics.GenerateRange(1, 10); }, 10);
429  
430 AddMenuItem("1507", "EQ3 FREQ",
431 () =>
432 {
433 return new[] { "OFF" }.Concat(Mathematics.GenerateRange(1500, 3200, 100)
434 .Select(i => i.ToString()));
435 }, "OFF");
436  
437 AddMenuItem("1508", "EQ3 LEVEL", () => { return Mathematics.GenerateRange(-20, 10); }, 5);
438  
439 AddMenuItem("1509", "EQ3 BWTH", () => { return Mathematics.GenerateRange(1, 10); }, 10);
440  
441 AddMenuItem("1510", "P-EQ1 FREQ",
442 () =>
443 {
444 return new[] { "OFF" }.Concat(Mathematics.GenerateRange(100, 700, 100)
445 .Select(i => i.ToString()));
446 }, "200");
447  
448 AddMenuItem("1511", "P-EQ1 LEVEL", () => { return Mathematics.GenerateRange(-20, 10); });
449  
450 AddMenuItem("1512", "P-EQ1 BWTH", () => { return Mathematics.GenerateRange(1, 10); }, 2);
451  
452 AddMenuItem("1513", "P-EQ2 FREQ",
453 () =>
454 {
455 return new[] { "OFF" }.Concat(Mathematics.GenerateRange(700, 1500, 100)
456 .Select(i => i.ToString()));
457 }, "800");
458  
459 AddMenuItem("1514", "P-EQ2 LEVEL", () => { return Mathematics.GenerateRange(-20, 10); });
460  
461 AddMenuItem("1515", "P-EQ2 BWTH", () => { return Mathematics.GenerateRange(1, 10); }, 1);
462  
463 AddMenuItem("1516", "P-EQ3 FREQ",
464 () =>
465 {
466 return new[] { "OFF" }.Concat(Mathematics.GenerateRange(1500, 3200, 100)
467 .Select(i => i.ToString()));
468 }, "2100");
469  
470 AddMenuItem("1517", "P-EQ3 LEVEL", () => { return Mathematics.GenerateRange(-20, 10); });
471  
472 AddMenuItem("1518", "P-EQ3 BWTH", () => { return Mathematics.GenerateRange(1, 10); }, 1);
473  
474 AddMenuItem("1601", "HF SSB PWR", () => { return Mathematics.GenerateRange(5, 100); }, 100);
475  
476 AddMenuItem("1602", "HF AM PWR", () => { return Mathematics.GenerateRange(5, 40); }, 40);
477  
478 AddMenuItem("1603", "HF PWR", () => { return Mathematics.GenerateRange(5, 100); }, 100);
479  
480 AddMenuItem("1604", "50M SSB PWR", () => { return Mathematics.GenerateRange(5, 100); }, 100);
481  
482 AddMenuItem("1605", "50M AM PWR", () => { return Mathematics.GenerateRange(5, 40); }, 40);
483  
484 AddMenuItem("1606", "50M PWR", () => { return Mathematics.GenerateRange(5, 100); }, 100);
485  
486 AddMenuItem("1607", "SSB MIC GAIN", () => { return Mathematics.GenerateRange(5, 100); }, 50);
487  
488 AddMenuItem("1608", "AM MIC GAIN", () => { return Mathematics.GenerateRange(5, 100); }, 50);
489  
490 AddMenuItem("1609", "FM MIC GAIN", () => { return Mathematics.GenerateRange(0, 100); }, 50);
491  
492 AddMenuItem("1610", "DATA MIC GAIN", () => { return Mathematics.GenerateRange(0, 100); }, 50);
493  
494 AddMenuItem("1611", "SSB DATA GAIN", () => { return Mathematics.GenerateRange(0, 100); }, 50);
495  
496 AddMenuItem("1612", "AM DATA GAIN", () => { return Mathematics.GenerateRange(0, 100); }, 50);
497  
498 AddMenuItem("1613", "FM DATA GAIN", () => { return Mathematics.GenerateRange(0, 100); }, 50);
499  
500 AddMenuItem("1614", "DATA DATA GAIN", () => { return Mathematics.GenerateRange(0, 100); }, 50);
501  
502 AddMenuItem("1615", "TUNER SELECT", () => { return new[] { "OFF", "EXTERNAL", "ATAS", "LAMP" }; },
503 "OFF");
504  
505 AddMenuItem("1616", "VOX SELECT", () => { return new[] { "MIC", "DATA" }; }, "MIC");
506  
507 AddMenuItem("1617", "VOX GAIN", () => { return Mathematics.GenerateRange(0, 100); }, 50);
508  
509 AddMenuItem("1618", "VOX DELAY", () => { return Mathematics.GenerateRange(30, 3000, 10); }, 1000);
510  
511 AddMenuItem("1619", "ANTI VOX GAIN", () => { return Mathematics.GenerateRange(0, 100); }, 50);
512  
513 AddMenuItem("1620", "DATA VOX GAIN", () => { return Mathematics.GenerateRange(0, 100); }, 50);
514  
515 AddMenuItem("1621", "DATA VOX DELAY", () => { return Mathematics.GenerateRange(30, 3000); }, 100);
516  
517 AddMenuItem("1622", "ANTI DVOX GAIN", () => { return Mathematics.GenerateRange(0, 100); });
518  
519 AddMenuItem("1623", "EMERGENCY FREQ", () => { return new[] { "DISABLE", "ENABLE" }; }, "DISABLE");
520  
521 break;
522 }
523  
524 _readCancellationTokenSource = new CancellationTokenSource();
525 _readLinkedCancellationTokenSource =
526 CancellationTokenSource.CreateLinkedTokenSource(new[]
527 { _cancellationTokenSource.Token, _cancellationToken });
528  
529 _readMenuTask = ReadMenu(_readCancellationTokenSource.Token);
530 }
531  
532 private async Task WriteMenu(CancellationToken cancellationToken)
533 {
534 var rows = GetAllDataGridViewRows(dataGridView1);
535  
536 if (!rows.Any()) return;
537  
538 var list = rows.ToList();
539  
540 var count = list.Count;
541  
542 toolStripProgressBar1.Minimum = 0;
543 toolStripProgressBar1.Maximum = count;
544 toolStripProgressBar1.Value = toolStripProgressBar1.Minimum;
545  
546 var progress = new Progress<DataGridViewRowProgress>(rowProgress =>
547 {
548 try
549 {
550 switch (rowProgress)
551 {
552 case DataGridViewRowProgressSuccess<int> rowProgressSuccess:
553 dataGridView1.Rows[rowProgressSuccess.Row.Index].DefaultCellStyle.BackColor =
554 DefaultBackColor;
555 toolStripStatusLabel1.Text = $"{Resources.Wrote_menu} {rowProgressSuccess.Data:0000}";
556 break;
557 case DataGridViewRowProgressFailure<int> rowProgressFailure:
558 Log.Error(rowProgressFailure.Exception, $"{Resources.Could_not_read_menu}");
559 dataGridView1.Rows[rowProgressFailure.Row.Index].DefaultCellStyle.BackColor = Color.Red;
560  
56 office 561 toolStripStatusLabel1.Text =
562 $"{Resources.Could_not_write_menu} {rowProgressFailure.Data:0000}";
54 office 563 break;
564 }
565  
566 toolStripProgressBar1.Increment(1);
567 statusStrip1.Update();
568 }
569 catch (Exception exception)
570 {
571 Log.Error(exception, Resources.Unexpected_error_while_reading_memory_bank);
572 }
573 });
574  
575 await Task.Run(() => WriteMenu(list, progress, cancellationToken), cancellationToken);
576  
577 if (!_cancellationToken.IsCancellationRequested)
578 {
579 toolStripProgressBar1.Value = toolStripProgressBar1.Maximum;
580 toolStripStatusLabel1.Text = "Done.";
581 }
582 }
583  
584 private async Task WriteMenu(IReadOnlyList<DataGridViewRow> rows, IProgress<DataGridViewRowProgress> progress,
585 CancellationToken cancellationToken)
586 {
587 var count = rows.Count;
588  
589 for (var i = 0; i < count && !cancellationToken.IsCancellationRequested; ++i)
590 {
56 office 591 if (!int.TryParse($"{rows[i].Cells["IndexColumn"].Value}", out var menu)) continue;
54 office 592  
593 try
594 {
595 var value = $"{rows[i].Cells["ValueColumn"].Value}";
596  
56 office 597 var parameter = _radioMenu.MenuToCAT(menu, value);
598  
54 office 599 await _catAssemblies.CatWriteAsync<int>("EX", new object[] { menu, parameter }, cancellationToken);
600  
601 progress.Report(new DataGridViewRowProgressSuccess<int>(rows[i], i, menu));
602 }
603 catch (UnexpectedRadioResponseException exception)
604 {
605 progress.Report(new DataGridViewRowProgressFailure<int>(rows[i], i, exception, menu));
606 }
607 catch (Exception exception)
608 {
609 progress.Report(new DataGridViewRowProgressFailure<int>(rows[i], i, exception, menu));
610 }
611 }
612 }
613  
614 private async Task ReadMenu(CancellationToken cancellationToken)
615 {
616 var rows = GetAllDataGridViewRows(dataGridView1);
617  
618 if (!rows.Any()) return;
619  
620 var list = rows.ToList();
621  
622 var count = list.Count;
623  
624 toolStripProgressBar1.Minimum = 0;
625 toolStripProgressBar1.Maximum = count;
626 toolStripProgressBar1.Value = toolStripProgressBar1.Minimum;
627  
628 var progress = new Progress<DataGridViewRowProgress>(rowProgress =>
629 {
630 try
631 {
632 switch (rowProgress)
633 {
634 case DataGridViewRowProgressSuccess<int> rowProgressSuccess:
635 dataGridView1.Rows[rowProgressSuccess.Row.Index].DefaultCellStyle.BackColor =
636 DefaultBackColor;
637  
638 if (!int.TryParse(
639 $"{dataGridView1.Rows[rowProgressSuccess.Row.Index].Cells["IndexColumn"].Value}",
640 out var menu)) throw new ArgumentException(Resources.Invalid_menu_item);
641  
642 switch (Configuration.Radio)
643 {
644 case "Yaesu FT-891":
645 switch (menu)
646 {
647 case 403:
648 var v403 = $"{rowProgressSuccess.Data}".ToCharArray();
649 dataGridView1.Rows[rowProgressSuccess.Row.Index].Cells["ValueColumn"]
650 .Value = $"{v403[0]}.{v403[1]}";
651 break;
652 case 205:
653 case 206:
654 case 207:
655 case 401:
656 case 402:
657 case 404:
658 case 405:
659 case 407:
660 case 408:
661 case 409:
662 case 410:
663 case 411:
664 case 501:
665 case 502:
666 case 505:
667 case 506:
668 case 507:
669 case 508:
670 case 509:
671 case 510:
672 case 511:
673 case 512:
674 case 514:
675 case 515:
676 case 516:
677 case 518:
678 case 519:
679 case 520:
680 case 601:
681 case 602:
682 case 603:
683 case 605:
684 case 607:
685 case 701:
686 case 702:
687 case 703:
688 case 704:
689 case 706:
690 case 707:
691 case 708:
692 case 710:
693 case 711:
694 case 712:
695 case 713:
696 case 801:
697 case 802:
698 case 805:
699 case 806:
700 case 807:
701 case 808:
702 case 809:
703 case 810:
704 case 811:
705 case 812:
706 case 901:
707 case 902:
708 case 903:
709 case 906:
710 case 1001:
711 case 1002:
712 case 1003:
713 case 1004:
714 case 1005:
715 case 1006:
716 case 1007:
717 case 1009:
718 case 1010:
719 case 1011:
720 case 1101:
721 case 1102:
722 case 1103:
723 case 1104:
724 case 1105:
725 case 1107:
726 case 1108:
727 case 1109:
728 case 1201:
729 case 1204:
730 case 1301:
731 case 1302:
732 case 1401:
733 case 1402:
734 case 1403:
735 case 1404:
736 case 1405:
737 case 1406:
738 case 1407:
739 case 1501:
740 case 1504:
741 case 1507:
742 case 1510:
743 case 1513:
744 case 1516:
745 case 1615:
746 case 1616:
747 case 1623:
748 var value = (dataGridView1.Rows[rowProgressSuccess.Row.Index]
749 .Cells["ValueColumn"] as DataGridViewComboBoxCell)
750 .Items[rowProgressSuccess.Data];
751 dataGridView1.Rows[rowProgressSuccess.Row.Index].Cells["ValueColumn"]
752 .Value = $"{value}";
753 break;
754 default:
755 dataGridView1.Rows[rowProgressSuccess.Row.Index].Cells["ValueColumn"]
756 .Value = $"{rowProgressSuccess.Data}";
757 break;
758 }
759  
760 break;
761 }
762  
763 toolStripStatusLabel1.Text = $"{Resources.Read_menu} {menu:0000}";
764 break;
765 case DataGridViewRowProgressFailure<int> rowProgressFailure:
766 Log.Error(rowProgressFailure.Exception, $"{Resources.Could_not_read_menu}");
767 dataGridView1.Rows[rowProgressFailure.Row.Index].DefaultCellStyle.BackColor = Color.Red;
768  
56 office 769 toolStripStatusLabel1.Text =
770 $"{Resources.Could_not_read_menu} {rowProgressFailure.Data:0000}";
54 office 771 break;
772 }
773  
774 toolStripProgressBar1.Increment(1);
775 statusStrip1.Update();
776 }
777 catch (Exception exception)
778 {
779 Log.Error(exception, Resources.Unexpected_error_while_reading_memory_bank);
780 }
781 });
782  
783 await Task.Run(() => ReadMenu(list, progress, cancellationToken), cancellationToken);
784  
785 if (!_cancellationToken.IsCancellationRequested)
786 try
787 {
788 toolStripProgressBar1.Value = toolStripProgressBar1.Maximum;
789 toolStripStatusLabel1.Text = "Done.";
790 }
56 office 791 catch (NullReferenceException ex)
54 office 792 {
793 // toolStripProgressBar1 disposed on close
794 }
795 }
796  
797 private async Task ReadMenu(IReadOnlyList<DataGridViewRow> rows, IProgress<DataGridViewRowProgress> progress,
798 CancellationToken cancellationToken)
799 {
800 var count = rows.Count;
801  
802 for (var i = 0; i < count && !cancellationToken.IsCancellationRequested; ++i)
803 {
56 office 804 if (!int.TryParse($"{rows[i].Cells["IndexColumn"].Value}", out var menu)) continue;
54 office 805  
806 try
807 {
808 var result = await _catAssemblies.CatReadAsync<int>("EX", new object[] { menu }, cancellationToken);
809  
810 progress.Report(new DataGridViewRowProgressSuccess<int>(rows[i], i, result));
811 }
812 catch (UnexpectedRadioResponseException exception)
813 {
814 progress.Report(new DataGridViewRowProgressFailure<int>(rows[i], i, exception, menu));
815 }
816 catch (Exception exception)
817 {
818 progress.Report(new DataGridViewRowProgressFailure<int>(rows[i], i, exception, menu));
819 }
820 }
821 }
822  
823 //Mix two colors
824 //Example: Steps=10 & Position=4 makes Color2 mix 40% into Color1
825 /// <summary>
826 /// Mix two colors.
827 /// </summary>
828 /// <param name="color1"></param>
829 /// <param name="color2"></param>
830 /// <param name="steps"></param>
831 /// <param name="position"></param>
832 /// <example>Steps=10 & Positon=4 makes Color2 mix 40% into Color1</example>
833 /// <remarks>https://stackoverflow.com/questions/38337849/transparent-selectionbackcolor-for-datagridview-cell</remarks>
834 /// <returns></returns>
835 public static Color MixColor(Color color1, Color color2, int steps, int position)
836 {
837 if (position <= 0 || steps <= 1) return color1;
838 if (position >= steps) return color2;
839 return Color.FromArgb(
840 color1.R + (color2.R - color1.R) / steps * position,
841 color1.G + (color2.G - color1.G) / steps * position,
842 color1.B + (color2.B - color1.B) / steps * position
843 );
844 }
845  
846 private static IEnumerable<DataGridViewRow> GetSelectedDataGridViewRows(DataGridView dataGridView)
847 {
848 return dataGridView.SelectedRows.OfType<DataGridViewRow>().OrderBy(row => row.Index);
849 }
850  
851 private void DataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
852 {
853 }
854  
855 private void DataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
856 {
857 var dataGridView = (DataGridView)sender;
858  
859 dataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);
860 }
861  
862 private void DataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
863 {
864 }
865  
866 private void DataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
867 {
868 }
869  
870 private void DataGridView1_CellMouseUp(object sender, DataGridViewCellMouseEventArgs e)
871 {
872 }
873  
874 private void DataGridView_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
875 {
876 }
877  
878 private void DataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e)
879 {
880 // @(-.-)@ -(o.o)- @(o_o)@
881 }
882  
883 private static List<DataGridViewRow> GetAllDataGridViewRows(DataGridView dataGridView)
884 {
885 return dataGridView.Rows.OfType<DataGridViewRow>().ToList();
886 }
887  
888 private void TextBox1_TextChanged(object sender, EventArgs e)
889 {
890 _searchTextBoxChangedContinuation.Schedule(TimeSpan.FromSeconds(1), () =>
891 {
892 textBox1.InvokeIfRequired(textBox =>
893 {
894 var search = textBox.Text;
895  
896 dataGridView1.InvokeIfRequired(dataGridView =>
897 {
898 foreach (var row in GetAllDataGridViewRows(dataGridView))
899 {
900 if (row.Cells["FunctionColumn"].Value == null) continue;
901  
902 switch (((string)row.Cells["FunctionColumn"].Value).IndexOf(search,
903 StringComparison.OrdinalIgnoreCase))
904 {
905 case -1:
906 row.Visible = false;
907 break;
908 default:
909 row.Visible = true;
910 break;
911 }
912 }
913 });
914 });
915 }, _cancellationToken);
916 }
917  
918 private async void button1_Click(object sender, EventArgs e)
919 {
920 if (_readLinkedCancellationTokenSource != null)
921 {
922 _readLinkedCancellationTokenSource.Cancel();
923 _readLinkedCancellationTokenSource = null;
924 }
925  
926 if (_readMenuTask != null)
927 {
928 await _readMenuTask;
929 _readMenuTask = null;
930 }
931  
932 _readCancellationTokenSource = new CancellationTokenSource();
933 _readLinkedCancellationTokenSource =
934 CancellationTokenSource.CreateLinkedTokenSource(new[]
935 { _cancellationTokenSource.Token, _cancellationToken });
936  
937 _readMenuTask = ReadMenu(_readLinkedCancellationTokenSource.Token);
938 }
939  
940 private void DataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
941 {
942 var dataGridView = sender as DataGridView;
943 foreach (DataGridViewCell cell in dataGridView.Rows[e.RowIndex].Cells)
944 {
945 if (cell.Selected == false) continue;
946 var bgColorCell = Color.White;
947 if (cell.Style.BackColor != Color.Empty)
948 bgColorCell = cell.Style.BackColor;
949 else if (cell.InheritedStyle.BackColor != Color.Empty) bgColorCell = cell.InheritedStyle.BackColor;
950 cell.Style.SelectionBackColor = MixColor(bgColorCell, Color.FromArgb(0, 150, 255), 10, 4);
951 }
952 }
953  
954 private async void button2_Click(object sender, EventArgs e)
955 {
956 if (_writeLinkedCancellationTokenSource != null)
957 {
958 _writeLinkedCancellationTokenSource.Cancel();
959 _writeLinkedCancellationTokenSource = null;
960 }
961  
962 if (_writeMenuTask != null)
963 {
964 await _writeMenuTask;
965 _writeMenuTask = null;
966 }
967  
968 _writeCancellationTokenSource = new CancellationTokenSource();
969 _writeLinkedCancellationTokenSource =
970 CancellationTokenSource.CreateLinkedTokenSource(new[]
971 { _cancellationTokenSource.Token, _cancellationToken });
972  
973 _writeMenuTask = WriteMenu(_writeLinkedCancellationTokenSource.Token);
974 }
56 office 975  
976 private void exportToolStripMenuItem_Click(object sender, EventArgs e)
977 {
978 saveFileDialog1.ShowDialog();
979 }
980  
981 private async void saveFileDialog1_FileOk(object sender, System.ComponentModel.CancelEventArgs e)
982 {
983 if (e.Cancel)
984 {
985 return;
986 }
987  
988 var rows = GetAllDataGridViewRows(dataGridView1);
989 var count = rows.Count;
990 toolStripProgressBar1.Minimum = 0;
991 toolStripProgressBar1.Maximum = count;
992 toolStripProgressBar1.Value = toolStripProgressBar1.Minimum;
993  
994 var dataGridViewRows = new ConcurrentQueue<DataGridViewRow>();
995 var dataGridViewRowsTaskCompletionSource = new TaskCompletionSource<object>();
996 var radioMenuTaskCompletionSource = new TaskCompletionSource<object>();
997  
998 var radioMenu = new RadioMenu();
999  
1000 async void IdleHandler(object idleHandlerSender, EventArgs idleHandlerArgs)
1001 {
1002 await dataGridViewRowsTaskCompletionSource.Task;
1003  
1004 try
1005 {
1006 if (!dataGridViewRows.TryDequeue(out var row))
1007 {
1008 Application.Idle -= IdleHandler;
1009  
1010 toolStripStatusLabel1.Text = "Done.";
1011  
1012 radioMenuTaskCompletionSource.TrySetResult(new { });
1013 return;
1014 }
1015  
1016 if (!int.TryParse($"{row.Cells["IndexColumn"].Value}", out var index))
1017 {
1018 return;
1019 }
1020  
1021 var value = $"{row.Cells["ValueColumn"].Value}";
1022  
1023 var radioMenuItem = new RadioMenuItem
1024 {
1025 Index = index,
1026 Value = value
1027 };
1028  
1029 radioMenu.RadioMenuItem.Add(radioMenuItem);
1030  
1031 toolStripStatusLabel1.Text = $"Exported menu {row.Index:0000}";
1032  
1033 toolStripProgressBar1.Increment(1);
1034 statusStrip1.Update();
1035 }
1036 catch (Exception exception)
1037 {
1038 Log.Error(exception, Resources.Could_not_update_data_grid_view);
1039 }
1040 }
1041  
1042 Application.Idle += IdleHandler;
1043 try
1044 {
1045 foreach (var row in rows)
1046 {
1047 dataGridViewRows.Enqueue(row);
1048 }
1049  
1050 dataGridViewRowsTaskCompletionSource.TrySetResult(new { });
1051 }
1052 catch (Exception exception)
1053 {
1054 Application.Idle -= IdleHandler;
1055  
1056 Log.Error(exception, Resources.Unable_to_create_radio_menu);
1057 }
1058  
1059 await radioMenuTaskCompletionSource.Task;
1060  
1061 var fileName = saveFileDialog1.FileName;
1062 switch (await Serialization.Serialize(radioMenu, fileName, "RadioMenu",
1063 "<!ATTLIST Configuration xmlns:xsi CDATA #IMPLIED xsi:noNamespaceSchemaLocation CDATA #IMPLIED>",
1064 _localCancellationToken))
1065 {
1066 case SerializationSuccess<RadioMenu> radioMenuSerializationSuccess:
1067 Log.Information(Resources.Radio_menu_serialized_successfully);
1068 break;
1069 case SerializationFailure serializationFailure:
1070 Log.Warning(serializationFailure.Exception.Message, Resources.Radio_menu_failed_to_serialize);
1071 break;
1072 }
1073 }
1074  
1075 private void importToolStripMenuItem_Click(object sender, EventArgs e)
1076 {
1077 openFileDialog1.ShowDialog();
1078 }
1079  
1080 private async void openFileDialog1_FileOk(object sender, System.ComponentModel.CancelEventArgs e)
1081 {
1082 if (e.Cancel)
1083 {
1084 return;
1085 }
1086  
1087 RadioMenu radioMenu = null;
1088  
1089 var fileName = openFileDialog1.FileName;
1090 var deserializationResult =
1091 await Serialization.Deserialize<RadioMenu>(fileName,
1092 "urn:hambook-radiomenu-schema", "RadioMenu.xsd",
1093 _localCancellationToken);
1094  
1095 switch (deserializationResult)
1096 {
1097 case SerializationSuccess<RadioMenu> serializationSuccess:
1098 Log.Information(Resources.Deserialized_radio_menu);
1099 radioMenu = serializationSuccess.Result;
1100 break;
1101 case SerializationFailure serializationFailure:
1102 Log.Warning(serializationFailure.Exception, Resources.Failed_to_deserialize_radio_menu);
1103 return;
1104 }
1105  
1106 var rows = GetAllDataGridViewRows(dataGridView1);
1107 var count = rows.Count;
1108 var menuIndexToRow = new Dictionary<int, DataGridViewRow>();
1109 foreach (var row in rows)
1110 {
1111 if (!int.TryParse($"{row.Cells["IndexColumn"].Value}", out var index))
1112 {
1113 continue;
1114 }
1115  
1116 menuIndexToRow.Add(index, row);
1117 }
1118  
1119 toolStripProgressBar1.Minimum = 0;
1120 toolStripProgressBar1.Maximum = count;
1121 toolStripProgressBar1.Value = toolStripProgressBar1.Minimum;
1122  
1123 var radioMenuItems = new ConcurrentQueue<RadioMenuItem>();
1124 var radioMenuItemsTaskCompletionSource = new TaskCompletionSource<object>();
1125  
1126 async void IdleHandler(object idleHandlerSender, EventArgs idleHandlerArgs)
1127 {
1128 await radioMenuItemsTaskCompletionSource.Task;
1129  
1130 try
1131 {
1132 if (!radioMenuItems.TryDequeue(out var radioMenuItem))
1133 {
1134 Application.Idle -= IdleHandler;
1135  
1136 dataGridView1.Sort(dataGridView1.Columns["IndexColumn"], ListSortDirection.Ascending);
1137 toolStripStatusLabel1.Text = "Done.";
1138  
1139 return;
1140 }
1141  
1142 menuIndexToRow[radioMenuItem.Index].Cells["ValueColumn"].Value = radioMenuItem.Value;
1143 toolStripStatusLabel1.Text = $"Imported menu {radioMenuItem.Index:0000}";
1144  
1145 toolStripProgressBar1.Increment(1);
1146 statusStrip1.Update();
1147 }
1148 catch (Exception exception)
1149 {
1150 Log.Error(exception, Resources.Could_not_update_data_grid_view);
1151 }
1152 }
1153  
1154 Application.Idle += IdleHandler;
1155 try
1156 {
1157 foreach (var radioMenuItem in radioMenu.RadioMenuItem)
1158 {
1159 radioMenuItems.Enqueue(radioMenuItem);
1160 }
1161  
1162 radioMenuItemsTaskCompletionSource.TrySetResult(new { });
1163 }
1164 catch (Exception exception)
1165 {
1166 Application.Idle -= IdleHandler;
1167  
1168 Log.Error(exception, Resources.Unable_to_create_radio_menu);
1169 }
1170 }
54 office 1171 }
1172 }