OSDN Git Service

一覧ウィンドウを一度も表示せずに終了するとエラーになるのを直す
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / Forms / ListForm.cs
1 // Copyright (C) 2014, 2015 Kazuhiro Fujieda <fujieda@users.osdn.me>\r
2 //\r
3 // Licensed under the Apache License, Version 2.0 (the "License");\r
4 // you may not use this file except in compliance with the License.\r
5 // You may obtain a copy of the License at\r
6 //\r
7 //    http://www.apache.org/licenses/LICENSE-2.0\r
8 //\r
9 // Unless required by applicable law or agreed to in writing, software\r
10 // distributed under the License is distributed on an "AS IS" BASIS,\r
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
12 // See the License for the specific language governing permissions and\r
13 // limitations under the License.\r
14 \r
15 using System;\r
16 using System.Collections.Generic;\r
17 using System.Drawing;\r
18 using System.Linq;\r
19 using System.Windows.Forms;\r
20 using KancolleSniffer.Model;\r
21 using KancolleSniffer.View;\r
22 using KancolleSniffer.View.ListWindow;\r
23 using KancolleSniffer.View.ShipListPanel;\r
24 using Clipboard = KancolleSniffer.Util.Clipboard;\r
25 \r
26 namespace KancolleSniffer.Forms\r
27 {\r
28     public partial class ListForm : Form\r
29     {\r
30         private readonly Sniffer _sniffer;\r
31         private readonly Config _config;\r
32         private readonly Form _form;\r
33         private readonly MainWindow.TimeOutChecker _suppressActivate;\r
34         private CheckBox[] _shipTypeCheckBoxes;\r
35         private bool _isMaster;\r
36         private Settings _settings;\r
37         public const int PanelWidth = 215;\r
38 \r
39         public class Settings\r
40         {\r
41             public string Mode { get; set; }\r
42             public ShipCategory ShipCategories { get; set; }\r
43             public bool ShipType { get; set; }\r
44             public bool ShowHpInPercent { get; set; }\r
45             public SortOrder SortOrder { get; set; }\r
46 \r
47             public static Settings FromShipListConfig(ShipListConfig config)\r
48             {\r
49                 return new Settings\r
50                 {\r
51                     Mode = config.Mode ?? "全艦",\r
52                     ShipCategories = config.ShipCategories,\r
53                     ShipType = config.ShipType,\r
54                     ShowHpInPercent = config.ShowHpInPercent,\r
55                     SortOrder = config.SortOrder\r
56                 };\r
57             }\r
58 \r
59             public void SetToShipListConfig(ShipListConfig config)\r
60             {\r
61                 config.Mode = Mode;\r
62                 config.ShipCategories = ShipCategories;\r
63                 config.ShipType = ShipType;\r
64                 config.ShowHpInPercent = ShowHpInPercent;\r
65                 config.SortOrder = SortOrder;\r
66             }\r
67         }\r
68 \r
69         private object[] PanelNames => new object[] {"全艦", "A", "B", "C", "D", "分類", "修復", "装備", "艦隊", "対空", "戦況", "情報"}\r
70             .Where(n => IsMaster || (string)n != "分類").ToArray();\r
71 \r
72         private char[] PanelKeys => new[] {'Z', 'A', 'B', 'C', 'D', 'G', 'R', 'W', 'X', 'Y', 'S', 'I'}\r
73             .Where(key => IsMaster || key != 'G').ToArray();\r
74 \r
75         public bool IsMaster\r
76         {\r
77             get => _isMaster;\r
78             set\r
79             {\r
80                 _isMaster = value;\r
81                 Text = _isMaster ? "一覧 プライマリ" : "一覧";\r
82                 comboBoxGroup.Items.Clear();\r
83                 comboBoxGroup.Items.AddRange(PanelNames);\r
84             }\r
85         }\r
86 \r
87         public enum SortOrder\r
88         {\r
89             None,\r
90             Cond,\r
91             CondAscend = Cond,\r
92             CondDescend,\r
93             ExpToNext,\r
94             ExpToNextAscend = ExpToNext,\r
95             ExpToNextDescend,\r
96             Repair\r
97         }\r
98 \r
99         public ListForm(MainWindow main)\r
100         {\r
101             InitializeComponent();\r
102             IsMaster = false;\r
103             _form = main.Form;\r
104             _sniffer = main.Sniffer;\r
105             _config = main.Config;\r
106             ApplySettings();\r
107             SetupShipTypeCheckBoxes();\r
108             _suppressActivate = main.SuppressActivate;\r
109             battleResultPanel.HpLabelClick += ToggleHpPercent;\r
110             shipListPanel.HpLabelClick += ToggleHpPercent;\r
111             var swipe = new SwipeScrollify();\r
112             swipe.AddShipListPanel(shipListPanel);\r
113             swipe.AddTreeView(itemTreeView);\r
114             swipe.AddPanel(fleetPanel);\r
115         }\r
116 \r
117         private void ApplySettings()\r
118         {\r
119             var config = GetConfig();\r
120             _settings = Settings.FromShipListConfig(config);\r
121             if (_settings.ShowHpInPercent)\r
122             {\r
123                 shipListPanel.ToggleHpPercent();\r
124                 battleResultPanel.ToggleHpPercent();\r
125             }\r
126             LoadShipGroupFromConfig();\r
127             comboBoxGroup.SelectedItem = _settings.Mode;\r
128         }\r
129 \r
130         private void SetupShipTypeCheckBoxes()\r
131         {\r
132             _shipTypeCheckBoxes = new[]\r
133             {\r
134                 checkBoxSTypeBattleShip,\r
135                 checkBoxSTypeAircraftCarrier,\r
136                 checkBoxSTypeHeavyCruiser,\r
137                 checkBoxSTypeLightCruiser,\r
138                 checkBoxSTypeDestroyer,\r
139                 checkBoxSTypeEscort,\r
140                 checkBoxSTypeSubmarine,\r
141                 checkBoxSTypeAuxiliary\r
142             };\r
143             SetCheckBoxSTypeState();\r
144         }\r
145 \r
146         public void UpdateList()\r
147         {\r
148             SetHeaderVisibility();\r
149             SetPanelVisibility();\r
150             if (InItemList)\r
151             {\r
152                 itemTreeView.SetNodes(_sniffer.ItemList);\r
153             }\r
154             else if (InFleetInfo)\r
155             {\r
156                 fleetPanel.Update(_sniffer);\r
157             }\r
158             else if (InAntiAir)\r
159             {\r
160                 antiAirPanel.Update(_sniffer);\r
161             }\r
162             else if (InMiscText)\r
163             {\r
164                 richTextBoxMiscText.Text = _sniffer.MiscText;\r
165             }\r
166             else if (InShipStatus || InGroupConfig || InRepairList)\r
167             {\r
168                 SetHeaderSortOrder();\r
169                 shipListPanel.Update(_sniffer, comboBoxGroup.Text, _settings);\r
170             }\r
171             if (shipListPanel.GroupUpdated)\r
172             {\r
173                 StoreShipGroupToConfig();\r
174                 _config.Save();\r
175                 shipListPanel.GroupUpdated = false;\r
176             }\r
177         }\r
178 \r
179         private void SetHeaderVisibility()\r
180         {\r
181             static void Set(Control header, bool visible)\r
182             {\r
183                 header.Visible = visible;\r
184                 if (visible)\r
185                     header.BringToFront();\r
186             }\r
187 \r
188             Set(panelShipHeader, InShipStatus);\r
189             Set(panelGroupHeader, InGroupConfig);\r
190             Set(panelRepairHeader, InRepairList);\r
191             Set(panelFleetHeader, InFleetInfo);\r
192             SetSTypeDropDownVisible(InShipStatus || InRepairList);\r
193         }\r
194 \r
195         private void SetPanelVisibility()\r
196         {\r
197             static void Set(Control panel, bool visible)\r
198             {\r
199                 // SwipeScrollifyが誤作動するのでEnabledも切り替える\r
200                 panel.Visible = panel.Enabled = visible;\r
201             }\r
202 \r
203             Set(shipListPanel, InShipStatus || InGroupConfig || InRepairList);\r
204             Set(itemTreeView, InItemList);\r
205             Set(fleetPanel, InFleetInfo);\r
206             Set(antiAirPanel, InAntiAir);\r
207             Set(airBattleResultPanel, InBattleResult);\r
208             Set(battleResultPanel, InBattleResult);\r
209             Set(richTextBoxMiscText, InMiscText);\r
210         }\r
211 \r
212         public void UpdateAirBattleResult()\r
213         {\r
214             airBattleResultPanel.ShowResultAutomatic = (_config.Spoilers & Spoiler.AirBattleResult) != 0;\r
215             airBattleResultPanel.SetResult(_sniffer);\r
216         }\r
217 \r
218         public void UpdateBattleResult()\r
219         {\r
220             MoveToBattleResult();\r
221             battleResultPanel.Spoilers = _config.Spoilers;\r
222             battleResultPanel.Update(_sniffer);\r
223             BackFromBattleResult();\r
224         }\r
225 \r
226         private int _prevSelectedIndex = -1;\r
227         private const int BattleResultIndex = 10;\r
228 \r
229         private void MoveToBattleResult()\r
230         {\r
231             if (!_isMaster || !_config.ShipList.AutoBattleResult || comboBoxGroup.SelectedIndex == BattleResultIndex ||\r
232                 _sniffer.InSortie == -1)\r
233                 return;\r
234             _prevSelectedIndex = comboBoxGroup.SelectedIndex;\r
235             comboBoxGroup.SelectedIndex = BattleResultIndex;\r
236         }\r
237 \r
238         private void BackFromBattleResult()\r
239         {\r
240             if (_sniffer.InSortie != -1 || _prevSelectedIndex == -1)\r
241                 return;\r
242             comboBoxGroup.SelectedIndex = _prevSelectedIndex;\r
243             _prevSelectedIndex = -1;\r
244         }\r
245 \r
246         public void UpdateCellInfo()\r
247         {\r
248             MoveToBattleResult();\r
249             battleResultPanel.Spoilers = _config.Spoilers;\r
250             battleResultPanel.UpdateCellInfo(_sniffer.CellInfo);\r
251         }\r
252 \r
253         private void SetHeaderSortOrder()\r
254         {\r
255             switch (_settings.SortOrder)\r
256             {\r
257                 case SortOrder.None:\r
258                     labelHeaderCond.Text = "cond";\r
259                     labelHeaderExp.Text = "Exp";\r
260                     break;\r
261                 case SortOrder.CondAscend:\r
262                     labelHeaderCond.Text = "cond▴";\r
263                     labelHeaderExp.Text = "Exp";\r
264                     break;\r
265                 case SortOrder.CondDescend:\r
266                     labelHeaderCond.Text = "cond▾";\r
267                     labelHeaderExp.Text = "Exp";\r
268                     break;\r
269                 case SortOrder.ExpToNextAscend:\r
270                     labelHeaderCond.Text = "cond";\r
271                     labelHeaderExp.Text = "Exp▴";\r
272                     break;\r
273                 case SortOrder.ExpToNextDescend:\r
274                     labelHeaderCond.Text = "cond";\r
275                     labelHeaderExp.Text = "Exp▾";\r
276                     break;\r
277             }\r
278         }\r
279 \r
280         private bool InShipStatus => Array.Exists(new[] {"全艦", "A", "B", "C", "D"}, x => _settings.Mode == x);\r
281 \r
282         private bool InGroupConfig => _settings.Mode == "分類";\r
283 \r
284         private bool InRepairList => _settings.Mode == "修復";\r
285 \r
286         private bool InItemList => _settings.Mode == "装備";\r
287 \r
288         private bool InFleetInfo => _settings.Mode == "艦隊";\r
289 \r
290         private bool InAntiAir => _settings.Mode == "対空";\r
291 \r
292         private bool InBattleResult => _settings.Mode == "戦況";\r
293 \r
294         private bool InMiscText => _settings.Mode == "情報";\r
295 \r
296         private void ListForm_Load(object sender, EventArgs e)\r
297         {\r
298             AdjustHeader();\r
299             SetMinimumSize();\r
300             comboBoxGroup.SelectedItem = _settings.Mode;\r
301             var config = GetConfig();\r
302             if (config.Location.X == int.MinValue)\r
303                 return;\r
304             var bounds = new Rectangle(config.Location, config.Size);\r
305             if (MainWindow.IsTitleBarOnAnyScreen(bounds.Location))\r
306                 Location = bounds.Location;\r
307             Size = bounds.Size;\r
308         }\r
309 \r
310         private void AdjustHeader()\r
311         {\r
312             if (_config.Zoom == 100)\r
313                 return;\r
314             foreach (var header in new[]\r
315             {\r
316                 panelShipHeader, panelGroupHeader, panelRepairHeader\r
317             })\r
318             {\r
319                 header.Left += SystemInformation.VerticalScrollBarWidth * (_config.Zoom - 100) / 100;\r
320             }\r
321         }\r
322 \r
323         private void SetMinimumSize()\r
324         {\r
325             MinimumSize = new Size(Width - Scaler.ScaleWidth(24) - SystemInformation.VerticalScrollBarWidth * (_config.Zoom - 100) / 100, 0);\r
326         }\r
327 \r
328         private ShipListConfig GetConfig()\r
329         {\r
330             if (_isMaster || _config.ListFormGroup.Count == 0)\r
331                 return _config.ShipList;\r
332             var config = _config.ListFormGroup[0];\r
333             _config.ListFormGroup.RemoveAt(0);\r
334             if (config.Mode == "分類")\r
335                 config.Mode = "全艦";\r
336             return config;\r
337         }\r
338 \r
339         private void LoadShipGroupFromConfig()\r
340         {\r
341             var group = _config.ShipList.ShipGroup;\r
342             for (var i = 0; i < GroupConfigLabels.GroupCount; i++)\r
343                 shipListPanel.GroupSettings[i] = i < group.Count ? new HashSet<int>(group[i]) : new HashSet<int>();\r
344         }\r
345 \r
346         private void SetCheckBoxSTypeState()\r
347         {\r
348             for (var type = 0; type < _shipTypeCheckBoxes.Length; type++)\r
349                 _shipTypeCheckBoxes[type].Checked = ((int)_settings.ShipCategories & (1 << type)) != 0;\r
350             checkBoxSTypeAll.Checked = _settings.ShipCategories == ShipCategory.All;\r
351             checkBoxSTypeDetails.Checked = _settings.ShipType;\r
352         }\r
353 \r
354         private void ListForm_FormClosing(object sender, FormClosingEventArgs e)\r
355         {\r
356             e.Cancel = true;\r
357             Hide();\r
358         }\r
359 \r
360         public void SaveConfig()\r
361         {\r
362             if (_isMaster)\r
363             {\r
364                 SaveMasterState();\r
365             }\r
366             else\r
367             {\r
368                 SaveSlaveState();\r
369             }\r
370         }\r
371 \r
372         private void SaveMasterState()\r
373         {\r
374             StoreShipGroupToConfig();\r
375             var config = _config.ShipList;\r
376             config.Visible = Visible && WindowState == FormWindowState.Normal;\r
377             _settings.SetToShipListConfig(config);\r
378             if (!Visible)\r
379                 return;\r
380             SaveBounds(config); // 最小化時は以前のサイズを記録する\r
381         }\r
382 \r
383         private void SaveSlaveState()\r
384         {\r
385             if (!Visible)\r
386                 return;\r
387             if (WindowState != FormWindowState.Normal) // 最小化時は次回復旧しない\r
388                 return;\r
389             var config = new ShipListConfig {Visible = true};\r
390             _settings.SetToShipListConfig(config);\r
391             _config.ListFormGroup.Add(config);\r
392             SaveBounds(config);\r
393         }\r
394 \r
395         private void SaveBounds(ShipListConfig config)\r
396         {\r
397             var bounds = WindowState == FormWindowState.Normal ? Bounds : RestoreBounds;\r
398             config.Location = bounds.Location;\r
399             config.Size = bounds.Size;\r
400         }\r
401 \r
402         public void ChangeWindowState(FormWindowState newState)\r
403         {\r
404             if (!Visible)\r
405                 return;\r
406             if (newState == FormWindowState.Minimized)\r
407             {\r
408                 if (WindowState == FormWindowState.Normal)\r
409                     WindowState = FormWindowState.Minimized;\r
410                 if (_config.HideOnMinimized)\r
411                     ShowInTaskbar = false;\r
412             }\r
413             else\r
414             {\r
415                 if (WindowState == FormWindowState.Minimized)\r
416                 {\r
417                     Application.DoEvents();\r
418                     if (_config.HideOnMinimized)\r
419                         ShowInTaskbar = true;\r
420                     WindowState = FormWindowState.Normal;\r
421                 }\r
422             }\r
423         }\r
424 \r
425         private void ListForm_Activated(object sender, EventArgs e)\r
426         {\r
427             if (!_isMaster)\r
428                 return;\r
429             if (_suppressActivate.Check())\r
430                 return;\r
431             if (WindowState == FormWindowState.Minimized)\r
432                 return;\r
433             RaiseBothWindows();\r
434         }\r
435 \r
436         private void RaiseBothWindows()\r
437         {\r
438             _form.Owner = null;\r
439             Owner = _form;\r
440             BringToFront();\r
441             Owner = null;\r
442         }\r
443 \r
444         private void StoreShipGroupToConfig()\r
445         {\r
446             var all = _sniffer.ShipList.Select(s => s.Id).ToArray();\r
447             var group = _config.ShipList.ShipGroup;\r
448             group.Clear();\r
449             for (var i = 0; i < GroupConfigLabels.GroupCount; i++)\r
450             {\r
451                 if (all.Length > 0)\r
452                     shipListPanel.GroupSettings[i].IntersectWith(all);\r
453                 group.Add(shipListPanel.GroupSettings[i].ToList());\r
454             }\r
455         }\r
456 \r
457         public void ShowShip(int id)\r
458         {\r
459             if (InShipStatus)\r
460             {\r
461                 shipListPanel.ShowShip(id);\r
462             }\r
463             else if (InFleetInfo)\r
464             {\r
465                 fleetPanel.ShowShip(id);\r
466             }\r
467             else if (InAntiAir)\r
468             {\r
469                 antiAirPanel.ShowShip(id);\r
470             }\r
471         }\r
472 \r
473         private void comboBoxGroup_DropDownClosed(object sender, EventArgs e)\r
474         {\r
475             SetActiveControl();\r
476         }\r
477 \r
478         private void comboBoxGroup_SelectedIndexChanged(object sender, EventArgs e)\r
479         {\r
480             _settings.Mode = comboBoxGroup.Text;\r
481             UpdateList();\r
482             SetActiveControl();\r
483             if (!(InShipStatus || InGroupConfig || InRepairList))\r
484                 SetPanelSTypeState(false);\r
485         }\r
486 \r
487         private void ListForm_KeyPress(object sender, KeyPressEventArgs e)\r
488         {\r
489             var g = Array.FindIndex(PanelKeys, x => x == char.ToUpper(e.KeyChar));\r
490             if (g == -1)\r
491                 return;\r
492             comboBoxGroup.SelectedIndex = g;\r
493             e.Handled = true;\r
494         }\r
495 \r
496         // マウスホイールでスクロールするためにコントロールにフォーカスを合わせる。\r
497         private void SetActiveControl()\r
498         {\r
499             if (InItemList)\r
500             {\r
501                 ActiveControl = itemTreeView;\r
502             }\r
503             else if (InFleetInfo)\r
504             {\r
505                 ActiveControl = fleetPanel;\r
506             }\r
507             else if (InAntiAir)\r
508             {\r
509                 ActiveControl = antiAirPanel;\r
510             }\r
511             else\r
512             {\r
513                 ActiveControl = shipListPanel;\r
514             }\r
515         }\r
516 \r
517         private void itemCsvToolStripMenuItem_Click(object sender, EventArgs e)\r
518         {\r
519             Clipboard.SetText(TextGenerator.GenerateItemList(_sniffer.ItemList));\r
520         }\r
521 \r
522         private void kantaiBunsekiToolStripMenuItem_Click(object sender, EventArgs e)\r
523         {\r
524             Clipboard.SetText(TextGenerator.GenerateKantaiBunsekiItemList(_sniffer.ItemList));\r
525         }\r
526 \r
527         private void fleetTextToolStripMenuItem_Click(object sender, EventArgs e)\r
528         {\r
529             Clipboard.SetText(TextGenerator.GenerateFleetData(_sniffer));\r
530         }\r
531 \r
532         private void deckBuilderToolStripMenuItem_Click(object sender, EventArgs e)\r
533         {\r
534             Clipboard.SetText(TextGenerator.GenerateDeckBuilderData(_sniffer));\r
535         }\r
536 \r
537         private void labelHeaderCond_Click(object sender, EventArgs e)\r
538         {\r
539             switch (_settings.SortOrder)\r
540             {\r
541                 case SortOrder.CondAscend:\r
542                     _settings.SortOrder = SortOrder.CondDescend;\r
543                     break;\r
544                 case SortOrder.CondDescend:\r
545                     _settings.SortOrder = SortOrder.None;\r
546                     break;\r
547                 default:\r
548                     _settings.SortOrder = SortOrder.CondAscend;\r
549                     break;\r
550             }\r
551             UpdateList();\r
552         }\r
553 \r
554         private void labelHeaderExp_Click(object sender, EventArgs e)\r
555         {\r
556             switch (_settings.SortOrder)\r
557             {\r
558                 case SortOrder.ExpToNextAscend:\r
559                     _settings.SortOrder = SortOrder.ExpToNextDescend;\r
560                     break;\r
561                 case SortOrder.ExpToNextDescend:\r
562                     _settings.SortOrder = SortOrder.None;\r
563                     break;\r
564                 default:\r
565                     _settings.SortOrder = SortOrder.ExpToNextAscend;\r
566                     break;\r
567             }\r
568             UpdateList();\r
569         }\r
570 \r
571         private void shipCsvToolStripMenuItem_Click(object sender, EventArgs e)\r
572         {\r
573             Clipboard.SetText(TextGenerator.GenerateShipList(shipListPanel.CurrentShipList));\r
574         }\r
575 \r
576         private void kantaiSarashiToolStripMenuItem_Click(object sender, EventArgs e)\r
577         {\r
578             Clipboard.SetText(TextGenerator.GenerateKantaiSarashiData(shipListPanel.CurrentShipList));\r
579         }\r
580 \r
581         private void labelFleet_Click(object sender, EventArgs e)\r
582         {\r
583             fleetPanel.ShowFleet(((Control)sender).Text);\r
584         }\r
585 \r
586         private void labelHeaderHp_Click(object sender, EventArgs e)\r
587         {\r
588             ToggleHpPercent();\r
589         }\r
590 \r
591         private void ToggleHpPercent()\r
592         {\r
593             _settings.ShowHpInPercent = !_settings.ShowHpInPercent;\r
594             shipListPanel.ToggleHpPercent();\r
595             battleResultPanel.ToggleHpPercent();\r
596         }\r
597 \r
598         private void SetSTypeDropDownVisible(bool visible)\r
599         {\r
600             if (!visible)\r
601                 SetPanelSTypeState(false);\r
602             dropDownButtonSType.Visible = visible;\r
603             labelSType.Visible = visible;\r
604         }\r
605 \r
606         private void labelSTypeButton_Click(object sender, EventArgs e)\r
607         {\r
608             SetPanelSTypeState(!panelSType.Visible);\r
609         }\r
610 \r
611         private void checkBoxSType_Click(object sender, EventArgs e)\r
612         {\r
613             _settings.ShipCategories = SelectedShipTypes;\r
614             UpdateList();\r
615             SetActiveControl();\r
616         }\r
617 \r
618         private ShipCategory SelectedShipTypes =>\r
619             (ShipCategory)_shipTypeCheckBoxes.Select((cb, type) => cb.Checked ? 1 << type : 0).Sum();\r
620 \r
621         private void checkBoxSTypeAll_Click(object sender, EventArgs e)\r
622         {\r
623             foreach (var checkBox in _shipTypeCheckBoxes)\r
624                 checkBox.Checked = checkBoxSTypeAll.Checked;\r
625             checkBoxSType_Click(sender, e);\r
626         }\r
627 \r
628         private void panelSType_Click(object sender, EventArgs e)\r
629         {\r
630             SetPanelSTypeState(false);\r
631         }\r
632 \r
633         private void SetPanelSTypeState(bool visible)\r
634         {\r
635             panelSType.Visible = visible;\r
636             if (visible)\r
637                 panelSType.BringToFront();\r
638             dropDownButtonSType.BackColor = visible ? CustomColors.ActiveButtonColor : DefaultBackColor;\r
639         }\r
640 \r
641         private void checkBoxSTypeDetails_Click(object sender, EventArgs e)\r
642         {\r
643             _settings.ShipType = checkBoxSTypeDetails.Checked;\r
644             UpdateList();\r
645             SetActiveControl();\r
646         }\r
647 \r
648         private void ListForm_ResizeEnd(object sender, EventArgs e)\r
649         {\r
650             foreach (var panel in new IPanelResize[] {shipListPanel, antiAirPanel, airBattleResultPanel, battleResultPanel, fleetPanel})\r
651             {\r
652                 if (panel.Visible)\r
653                     panel.ApplyResize();\r
654             }\r
655         }\r
656     }\r
657 }