HamBook – Blame information for rev 56

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