HamBook – Diff between revs 54 and 56

Subversion Repositories:
Rev:
Show entire fileIgnore whitespace
Rev 54 Rev 56
Line 8... Line 8...
8 using System.Threading.Tasks; 8 using System.Threading.Tasks;
9 using System.Windows.Forms; 9 using System.Windows.Forms;
10 using HamBook.Properties; 10 using HamBook.Properties;
11 using HamBook.Radios; 11 using HamBook.Radios;
12 using HamBook.Radios.Generic; 12 using HamBook.Radios.Generic;
-   13 using HamBook.Radios.Yaesu.FT_891;
13 using HamBook.Utilities; 14 using HamBook.Utilities;
-   15 using HamBook.Utilities.Serialization;
14 using Serilog; 16 using Serilog;
15 using static Org.BouncyCastle.Crypto.Digests.SkeinEngine; 17 using static System.Windows.Forms.VisualStyles.VisualStyleElement.ProgressBar;
Line 16... Line 18...
16   18  
17 namespace HamBook 19 namespace HamBook
18 { 20 {
19 public partial class MenuForm : Form 21 public partial class MenuForm : Form
20 { 22 {
-   23 private static ScheduledContinuation _searchTextBoxChangedContinuation;
Line 21... Line 24...
21 private static ScheduledContinuation _searchTextBoxChangedContinuation; 24 private readonly CancellationTokenSource _cancellationTokenSource;
22   -  
23 private readonly CatAssemblies _catAssemblies; -  
24 private readonly MenuIndex _menuIndex; 25  
25 private CancellationToken _cancellationToken; 26 private readonly CatAssemblies _catAssemblies;
26 private CancellationToken _localCancellationToken; 27 private readonly CancellationToken _localCancellationToken;
27 private readonly CancellationTokenSource _localCancellationTokenSource; -  
28 private readonly CancellationTokenSource _cancellationTokenSource; 28 private readonly CancellationTokenSource _localCancellationTokenSource;
-   29 private CancellationToken _cancellationToken;
29 private CancellationTokenSource _readLinkedCancellationTokenSource; 30 private CancellationTokenSource _readCancellationTokenSource;
30 private CancellationTokenSource _readCancellationTokenSource; 31 private CancellationTokenSource _readLinkedCancellationTokenSource;
31 private Task _readMenuTask; 32 private Task _readMenuTask;
32 private CancellationTokenSource _writeCancellationTokenSource; 33 private CancellationTokenSource _writeCancellationTokenSource;
-   34 private CancellationTokenSource _writeLinkedCancellationTokenSource;
Line 33... Line 35...
33 private CancellationTokenSource _writeLinkedCancellationTokenSource; 35 private Task _writeMenuTask;
34 private Task _writeMenuTask; 36 private readonly Radios.Generic.RadioMenu _radioMenu;
35   37  
36 public MenuForm() 38 public MenuForm()
Line 48... Line 50...
48 Configuration = configuration; 50 Configuration = configuration;
49 _catAssemblies = catAssemblies; 51 _catAssemblies = catAssemblies;
50 _cancellationToken = cancellationToken; 52 _cancellationToken = cancellationToken;
Line 51... Line 53...
51   53  
52 _searchTextBoxChangedContinuation = new ScheduledContinuation(); 54 _searchTextBoxChangedContinuation = new ScheduledContinuation();
Line 53... Line 55...
53 _menuIndex = MenuIndex.Create(Configuration.Radio); 55 _radioMenu = Radios.Generic.RadioMenu.Create(Configuration.Radio);
54   56  
55 _cancellationTokenSource = 57 _cancellationTokenSource =
56 CancellationTokenSource.CreateLinkedTokenSource(_localCancellationToken, cancellationToken); 58 CancellationTokenSource.CreateLinkedTokenSource(_localCancellationToken, cancellationToken);
Line 134... Line 136...
134   136  
135 return value; 137 return value;
Line 136... Line 138...
136 }, "3.0"); 138 }, "3.0");
-   139  
-   140 AddMenuItem("0404", "BEACON INTERVAL",
137   141 () =>
-   142 {
138 AddMenuItem("0404", "BEACON INTERVAL", 143 return new[] { "OFF" }.Concat(Mathematics.GenerateRange(1, 690).Select(i => i.ToString()));
Line 139... Line 144...
139 () => { return new[] { "OFF" }.Concat(Mathematics.GenerateRange(1, 690).Select(i => i.ToString())); }, 144 },
140 "OFF"); 145 "OFF");
Line 550... Line 555...
550 break; 555 break;
551 case DataGridViewRowProgressFailure<int> rowProgressFailure: 556 case DataGridViewRowProgressFailure<int> rowProgressFailure:
552 Log.Error(rowProgressFailure.Exception, $"{Resources.Could_not_read_menu}"); 557 Log.Error(rowProgressFailure.Exception, $"{Resources.Could_not_read_menu}");
553 dataGridView1.Rows[rowProgressFailure.Row.Index].DefaultCellStyle.BackColor = Color.Red; 558 dataGridView1.Rows[rowProgressFailure.Row.Index].DefaultCellStyle.BackColor = Color.Red;
Line -... Line 559...
-   559  
554   560 toolStripStatusLabel1.Text =
555 toolStripStatusLabel1.Text = $"{Resources.Could_not_write_menu} {rowProgressFailure.Data:0000}"; 561 $"{Resources.Could_not_write_menu} {rowProgressFailure.Data:0000}";
556 break; 562 break;
Line 557... Line 563...
557 } 563 }
558   564  
Line 579... Line 585...
579 { 585 {
580 var count = rows.Count; 586 var count = rows.Count;
Line 581... Line 587...
581   587  
582 for (var i = 0; i < count && !cancellationToken.IsCancellationRequested; ++i) 588 for (var i = 0; i < count && !cancellationToken.IsCancellationRequested; ++i)
583 { 589 {
584 if (!int.TryParse($"{rows[i].Cells["IndexColumn"].Value}", out var menu)) -  
585 { -  
586 continue; -  
Line 587... Line 590...
587 } 590 if (!int.TryParse($"{rows[i].Cells["IndexColumn"].Value}", out var menu)) continue;
588   591  
589 try 592 try
590 { -  
591 var value = $"{rows[i].Cells["ValueColumn"].Value}"; -  
592 int parameter = 0; -  
593 switch (menu) -  
594 { -  
595 case 205: -  
596 parameter = Array.IndexOf(new[] { "OFF", "0.5", "1.0", "2.0" }, value); -  
597 break; -  
598 case 508: -  
599 case 509: -  
600 case 510: -  
601 case 511: -  
602 case 512: -  
603 case 515: -  
604 case 1623: -  
605 case 206: -  
606 parameter = Array.IndexOf(new[] { "DISABLE", "ENABLE" }, value); -  
607 break; -  
608 case 207: -  
609 parameter = Array.IndexOf(new[] { "UPPER", "LOWER" }, value); -  
610 break; -  
611 case 401: -  
612 parameter = Array.IndexOf(new[] { "OFF", "BUG", "ELEKEY-A", "ELEKEY-B", "ELEKEY-Y", "ACS" }, -  
613 value); -  
614 break; -  
615 case 1006: -  
616 case 1007: -  
617 case 402: -  
618 parameter = Array.IndexOf(new[] { "NOR", "REV" }, value); -  
619 break; -  
620 case 403: -  
621 var list = new List<string>(); -  
622 for (var j = 2.0; j <= 4.5; j += 0.1) -  
623 { -  
624 var v = $"{(decimal)j:f1}"; -  
625 list.Add(v); -  
626 } -  
627   -  
628 parameter = list.IndexOf(value); -  
629 break; -  
630 case 404: -  
631 parameter = Array.IndexOf( -  
632 new[] { "OFF" }.Concat(Mathematics.GenerateRange(1, 690).Select(o => o.ToString())) -  
633 .ToArray(), value); -  
634 break; -  
635 case 405: -  
636 parameter = Array.IndexOf(new[] { "1290", "AUNO", "AUNT", "A2NO", "A2NT", "12NO", "12NT" }, -  
637 value); -  
638 break; -  
639 case 407: -  
640 case 408: -  
641 case 409: -  
642 case 410: -  
643 case 411: -  
644 parameter = Array.IndexOf(new[] { "TEXT", "MESSAGE" }, value); -  
645 break; -  
646 case 501: -  
647 parameter = Array.IndexOf(new[] { 1, 3, 10 }, value); -  
648 break; -  
649 case 502: -  
650 parameter = Array.IndexOf(new[] { 10, 30, 50 }, value); -  
651 break; -  
652 case 505: -  
653 parameter = Array.IndexOf(new[] { "RF", "SQL" }, value); -  
654 break; -  
655 case 506: -  
656 parameter = Array.IndexOf(new[] { 4800, 9600, 19200, 38400 }, value); -  
657 break; -  
658 case 507: -  
659 parameter = Array.IndexOf(new[] { 10, 100, 1000, 3000 }, value); -  
660 break; -  
661 case 513: -  
662 parameter = Array.IndexOf(Mathematics.GenerateRange(-20, 20).ToArray(), value); -  
663 break; -  
664 case 514: -  
665 parameter = Array.IndexOf( -  
666 new[] { "OFF" }.Concat(Mathematics.GenerateRange(1, 30).Select(o => o.ToString())) -  
667 .ToArray(), -  
668 value); -  
669 break; -  
670 case 516: -  
671 parameter = Array.IndexOf(new[] { "PAUSE", "TIME" }, value); -  
672 break; -  
673 case 517: -  
674 parameter = Array.IndexOf(Mathematics.GenerateRange(-25, 25).ToArray(), value); -  
675 break; -  
676 case 518: -  
677 parameter = Array.IndexOf(new[] { "RX", "TX", "TRX" }, value); -  
678 break; -  
679 case 519: -  
680 parameter = Array.IndexOf(new[] { "OFF", "1", "2", "4", "6", "8", "10", "12" }, value); -  
681 break; -  
682 case 520: -  
683 parameter = Array.IndexOf(new[] { "NORMAL", "CONTEST" }, value); -  
684 break; -  
685 case 601: -  
686 parameter = Array.IndexOf(new[] { "OFF" }.Concat(Mathematics.GenerateRange(100, 1000, 50) -  
687 .Select(o => o.ToString())).ToArray(), value); -  
688 break; -  
689 case 1102: -  
690 case 1104: -  
691 case 1002: -  
692 case 1004: -  
693 case 806: -  
694 case 808: -  
695 case 704: -  
696 case 702: -  
697 case 604: -  
698 case 602: -  
699 parameter = Array.IndexOf(new[] { 6, 18 }, value); -  
700 break; -  
701 case 603: -  
702 parameter = Array.IndexOf(new[] { "OFF" }.Concat(Mathematics.GenerateRange(700, 4000, 50) -  
703 .Select(o => o.ToString())).ToArray(), value); -  
704 break; -  
705 case 1105: -  
706 case 901: -  
707 case 809: -  
708 case 605: -  
709 parameter = Array.IndexOf(new[] { "MIC", "REAR" }, value); -  
710 break; -  
711 case 1108: -  
712 case 903: -  
713 case 810: -  
714 case 607: -  
715 parameter = Array.IndexOf(new[] { "DAKY", "RTS", "DTR" }, value); -  
716 break; -  
717 case 701: -  
718 parameter = Array.IndexOf(new[] { "OFF" }.Concat(Mathematics.GenerateRange(100, 1000, 50) -  
719 .Select(o => o.ToString())).ToArray(), value); -  
720 break; -  
721 case 703: -  
722 parameter = Array.IndexOf(new[] { "OFF" }.Concat(Mathematics.GenerateRange(700, 4000, 50) -  
723 .Select(o => o.ToString())).ToArray(), value); -  
724 break; -  
725 case 706: -  
726 parameter = Array.IndexOf(new[] { "OFF", "50M", "ON" }, value); -  
727 break; -  
728 case 1107: -  
729 case 707: -  
730 parameter = Array.IndexOf(new[] { "USB", "LSB", "AUTO" }, value); -  
731 break; -  
732 case 708: -  
733 parameter = Array.IndexOf(new[] { "SEMI", "FULL" }, value); -  
734 break; -  
735 case 709: -  
736 parameter = Array.IndexOf(Mathematics.GenerateRange(30, 3000, 10).ToArray(), value); -  
737 break; -  
738 case 710: -  
739 parameter = Array.IndexOf(new[] { string.Empty, "2", "4" }, value); -  
740 break; -  
741 case 711: -  
742 parameter = Array.IndexOf(new[] { "FREQ", "PITCH" }, value); -  
743 break; -  
744 case 712: -  
745 parameter = Array.IndexOf(new[] { "OFF", "DAKY", "RTS", "DTR" }, value); -  
746 break; -  
747 case 713: -  
748 parameter = Array.IndexOf(new[] { 15, 20, 25, 30 }, value); -  
749 break; -  
750 case 801: -  
751 parameter = Array.IndexOf(new[] { "PSK", "OTHERS" }, value); -  
752 break; -  
753 case 802: -  
754 parameter = Array.IndexOf(new[] { 1000, 1500, 2000 }, value); -  
755 break; -  
756 case 803: -  
757 parameter = Array.IndexOf(Mathematics.GenerateRange(-3000, 3000, 10).ToArray(), value); -  
758 break; -  
759 case 804: -  
760 parameter = Array.IndexOf(Mathematics.GenerateRange(-3000, 3000, 10).ToArray(), value); -  
761 break; -  
762 case 805: -  
763 parameter = Array.IndexOf(new[] { "OFF" }.Concat(Mathematics.GenerateRange(100, 1000, 50) -  
764 .Select(o => o.ToString())).ToArray(), value); -  
765 break; -  
766 case 807: -  
767 parameter = Array.IndexOf(new[] { "OFF" }.Concat(Mathematics.GenerateRange(700, 4000, 50) -  
768 .Select(o => o.ToString())).ToArray(), value); -  
769 break; -  
770 case 1011: -  
771 case 812: -  
772 parameter = Array.IndexOf(new[] { "USB", "LSB" }, value); -  
773 break; -  
774 case 904: -  
775 parameter = Array.IndexOf(Mathematics.GenerateRange(0, 1000, 10).ToArray(), value); -  
776 break; -  
777 case 905: -  
778 parameter = Array.IndexOf(Mathematics.GenerateRange(0, 4000, 10).ToArray(), value); -  
779 break; -  
780 case 906: -  
781 parameter = Array.IndexOf(new[] { "Tn-Rn", "Tn-Riv", "Tiv-Rn", "Tiv-Riv" }, value); -  
782 break; -  
783 case 1001: -  
784 parameter = Array.IndexOf(new[] { "OFF" }.Concat(Mathematics.GenerateRange(100, 1000, 50) -  
785 .Select(o => o.ToString())).ToArray(), value); -  
786 break; -  
787 case 1003: -  
788 parameter = Array.IndexOf(new[] { "OFF" }.Concat(Mathematics.GenerateRange(700, 4000, 50) -  
789 .Select(o => o.ToString())).ToArray(), value); -  
790 break; -  
791 case 1005: -  
792 parameter = Array.IndexOf(new[] { "SHIFT", "DTR", "RTS" }, value); -  
793 break; -  
794 case 1009: -  
795 parameter = Array.IndexOf(new[] { 170, 200, 425, 850 }, value); -  
796 break; -  
797 case 1010: -  
798 parameter = Array.IndexOf(new[] { 1275, 2125 }, value); -  
799 break; -  
800 case 1101: -  
801 parameter = Array.IndexOf(new[] { "OFF" }.Concat(Mathematics.GenerateRange(100, 1000, 50) -  
802 .Select(o => o.ToString())).ToArray(), value); -  
803 break; -  
804 case 1103: -  
805 parameter = Array.IndexOf(new[] { "OFF" }.Concat(Mathematics.GenerateRange(700, 4000, 50) -  
806 .Select(o => o.ToString())).ToArray(), value); -  
807 break; -  
808 case 1109: -  
809 parameter = Array.IndexOf( -  
810 new[] { "100-3000", "100-2900", "200-2800", "300-2700", "400-2600" }, value); -  
811 break; -  
812 case 1201: -  
813 parameter = Array.IndexOf(new[] { "NARROW", "MEDIUM", "WIDE" }, value); -  
814 break; -  
815 case 1202: -  
816 parameter = Array.IndexOf(Mathematics.GenerateRange(-40, 20).ToArray(), value); -  
817 break; -  
818 case 1204: -  
819 parameter = Array.IndexOf(new[] { "NARROW", "WIDE" }, value); -  
820 break; -  
821 case 1301: -  
822 parameter = Array.IndexOf(new[] { "OFF", "3", "5", "10" }, value); -  
823 break; -  
824 case 1302: -  
825 parameter = Array.IndexOf(new[] { 37.5, 75, 150, 375, 750 }, value); -  
826 break; -  
827 case 1401: -  
828 parameter = Array.IndexOf(new[] { 50, 100, 500 }, value); -  
829 break; -  
830 case 1402: -  
831 parameter = Array.IndexOf(new[] { 2, 5, 10 }, value); -  
832 break; -  
833 case 1403: -  
834 case 1404: -  
835 parameter = Array.IndexOf(new[] { 2, 5, 10 }, value); -  
836 break; -  
837 case 1405: -  
838 parameter = Array.IndexOf(new[] { 2, 5, 10 }, value); -  
839 break; -  
840 case 1406: -  
841 parameter = Array.IndexOf(new[] { 2.5, 5, 2.9, 10, 12.5, 25 }, value); -  
842 break; -  
843 case 1407: -  
844 parameter = Array.IndexOf(new[] { 5, 6.25, 10, 12.5, 15, 20, 25 }, value); -  
845 break; -  
846 case 1501: -  
847 parameter = Array.IndexOf(new[] { "OFF" }.Concat(Mathematics.GenerateRange(100, 700, 100) -  
848 .Select(o => o.ToString())).ToArray(), value); -  
849 break; -  
850 case 1504: -  
851 parameter = Array.IndexOf(new[] { "OFF" }.Concat(Mathematics.GenerateRange(700, 1500, 100) -  
852 .Select(o => o.ToString())).ToArray(), value); -  
853 break; -  
854 case 1514: -  
855 case 1511: -  
856 case 1508: -  
857 case 1505: -  
858 parameter = Array.IndexOf(Mathematics.GenerateRange(-20, 10).ToArray(), value); -  
859 break; -  
860 case 1507: -  
861 parameter = Array.IndexOf(new[] { "OFF" }.Concat(Mathematics.GenerateRange(1500, 3200, 100) -  
862 .Select(o => o.ToString())).ToArray(), value); -  
863 break; -  
864 case 1510: -  
865 parameter = Array.IndexOf(new[] { "OFF" }.Concat(Mathematics.GenerateRange(100, 700, 100) -  
866 .Select(o => o.ToString())).ToArray(), value); -  
867 break; -  
868 case 1513: -  
869 parameter = Array.IndexOf(new[] { "OFF" }.Concat(Mathematics.GenerateRange(700, 1500, 100) -  
870 .Select(o => o.ToString())).ToArray(), value); -  
871 break; -  
872 case 1515: -  
873 parameter = Array.IndexOf(Mathematics.GenerateRange(1, 10).ToArray(), value); -  
874 break; -  
875 case 1516: -  
876 parameter = Array.IndexOf(new[] { "OFF" }.Concat(Mathematics.GenerateRange(1500, 3200, 100) -  
877 .Select(o => o.ToString())).ToArray(), value); -  
878 break; -  
879 case 1614: -  
880 case 1613: -  
881 case 1612: -  
882 case 1611: -  
883 case 1610: -  
884 case 1609: -  
885 case 1608: -  
886 case 1607: -  
887 case 1606: -  
888 case 1603: -  
889 case 1604: -  
890 case 1601: -  
891 parameter = Array.IndexOf(Mathematics.GenerateRange(5, 100).ToArray(), value); -  
892 break; -  
893 case 1605: -  
894 case 1602: -  
895 parameter = Array.IndexOf(Mathematics.GenerateRange(5, 40).ToArray(), value); -  
896 break; -  
897 case 1615: -  
898 parameter = Array.IndexOf(new[] { "OFF", "EXTERNAL", "ATAS", "LAMP" }, value); -  
899 break; -  
900 case 1616: -  
901 parameter = Array.IndexOf(new[] { "MIC", "DATA" }, value); -  
902 break; -  
903 case 1618: -  
904 parameter = Array.IndexOf(Mathematics.GenerateRange(30, 3000, 10).ToArray(), value); -  
905 break; -  
906 case 1622: -  
907 case 1620: -  
908 case 1619: -  
909 parameter = Array.IndexOf(Mathematics.GenerateRange(0, 100).ToArray(), value); -  
910 break; -  
911 case 1621: -  
912 parameter = Array.IndexOf(Mathematics.GenerateRange(30, 3000).ToArray(), value); -  
913 break; -  
914 default: -  
915 if (!int.TryParse(value, out parameter)) -  
916 { -  
917 throw new ArgumentException(Resources.Invalid_menu_item); -  
918 } -  
919   -  
Line -... Line 593...
-   593 {
-   594 var value = $"{rows[i].Cells["ValueColumn"].Value}";
920 break; 595  
Line 921... Line 596...
921 } 596 var parameter = _radioMenu.MenuToCAT(menu, value);
922   597
923 await _catAssemblies.CatWriteAsync<int>("EX", new object[] { menu, parameter }, cancellationToken); 598 await _catAssemblies.CatWriteAsync<int>("EX", new object[] { menu, parameter }, cancellationToken);
Line 1088... Line 763...
1088 break; 763 break;
1089 case DataGridViewRowProgressFailure<int> rowProgressFailure: 764 case DataGridViewRowProgressFailure<int> rowProgressFailure:
1090 Log.Error(rowProgressFailure.Exception, $"{Resources.Could_not_read_menu}"); 765 Log.Error(rowProgressFailure.Exception, $"{Resources.Could_not_read_menu}");
1091 dataGridView1.Rows[rowProgressFailure.Row.Index].DefaultCellStyle.BackColor = Color.Red; 766 dataGridView1.Rows[rowProgressFailure.Row.Index].DefaultCellStyle.BackColor = Color.Red;
Line -... Line 767...
-   767  
1092   768 toolStripStatusLabel1.Text =
1093 toolStripStatusLabel1.Text = $"{Resources.Could_not_read_menu} {rowProgressFailure.Data:0000}"; 769 $"{Resources.Could_not_read_menu} {rowProgressFailure.Data:0000}";
1094 break; 770 break;
Line 1095... Line 771...
1095 } 771 }
1096   772  
Line 1104... Line 780...
1104 }); 780 });
Line 1105... Line 781...
1105   781  
Line 1106... Line 782...
1106 await Task.Run(() => ReadMenu(list, progress, cancellationToken), cancellationToken); 782 await Task.Run(() => ReadMenu(list, progress, cancellationToken), cancellationToken);
1107   -  
1108 if (!_cancellationToken.IsCancellationRequested) 783  
1109 { 784 if (!_cancellationToken.IsCancellationRequested)
1110 try 785 try
1111 { 786 {
1112 toolStripProgressBar1.Value = toolStripProgressBar1.Maximum; 787 toolStripProgressBar1.Value = toolStripProgressBar1.Maximum;
1113 toolStripStatusLabel1.Text = "Done."; 788 toolStripStatusLabel1.Text = "Done.";
1114 } 789 }
1115 catch(NullReferenceException ex) 790 catch (NullReferenceException ex)
1116 { 791 {
1117 // toolStripProgressBar1 disposed on close -  
1118 } 792 // toolStripProgressBar1 disposed on close
Line 1119... Line 793...
1119 } 793 }
1120 } 794 }
1121   795  
1122 private async Task ReadMenu(IReadOnlyList<DataGridViewRow> rows, IProgress<DataGridViewRowProgress> progress, 796 private async Task ReadMenu(IReadOnlyList<DataGridViewRow> rows, IProgress<DataGridViewRowProgress> progress,
Line 1123... Line 797...
1123 CancellationToken cancellationToken) 797 CancellationToken cancellationToken)
1124 { 798 {
1125 var count = rows.Count; 799 var count = rows.Count;
1126   -  
1127 for (var i = 0; i < count && !cancellationToken.IsCancellationRequested; ++i) -  
1128 { -  
Line 1129... Line 800...
1129 if (!int.TryParse($"{rows[i].Cells["IndexColumn"].Value}", out var menu)) 800  
1130 { 801 for (var i = 0; i < count && !cancellationToken.IsCancellationRequested; ++i)
1131 continue; 802 {
Line 1176... Line 847...
1176 return dataGridView.SelectedRows.OfType<DataGridViewRow>().OrderBy(row => row.Index); 847 return dataGridView.SelectedRows.OfType<DataGridViewRow>().OrderBy(row => row.Index);
1177 } 848 }
Line 1178... Line 849...
1178   849  
1179 private void DataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e) 850 private void DataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
1180 { -  
1181   851 {
Line 1182... Line 852...
1182 } 852 }
1183   853  
1184 private void DataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e) 854 private void DataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
Line 1192... Line 862...
1192 { 862 {
1193 } 863 }
Line 1194... Line 864...
1194   864  
1195 private void DataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) 865 private void DataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
1196 { -  
1197   866 {
Line 1198... Line 867...
1198 } 867 }
1199   868  
1200 private void DataGridView1_CellMouseUp(object sender, DataGridViewCellMouseEventArgs e) -  
1201 { 869 private void DataGridView1_CellMouseUp(object sender, DataGridViewCellMouseEventArgs e)
Line 1202... Line 870...
1202   870 {
1203 } 871 }
1204   -  
1205 private void DataGridView_CellDoubleClick(object sender, DataGridViewCellEventArgs e) 872  
Line 1206... Line 873...
1206 { 873 private void DataGridView_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
1207   874 {
1208 } 875 }
Line 1302... Line 969...
1302 CancellationTokenSource.CreateLinkedTokenSource(new[] 969 CancellationTokenSource.CreateLinkedTokenSource(new[]
1303 { _cancellationTokenSource.Token, _cancellationToken }); 970 { _cancellationTokenSource.Token, _cancellationToken });
Line 1304... Line 971...
1304   971  
1305 _writeMenuTask = WriteMenu(_writeLinkedCancellationTokenSource.Token); 972 _writeMenuTask = WriteMenu(_writeLinkedCancellationTokenSource.Token);
-   973 }
-   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 }
1306 } 1169 }
1307 } 1170 }
1308 } 1171 }