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 readonly 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             _suppressActivate = main.SuppressActivate;\r
107             _shipTypeCheckBoxes = new[]\r
108             {\r
109                 checkBoxSTypeBattleShip,\r
110                 checkBoxSTypeAircraftCarrier,\r
111                 checkBoxSTypeHeavyCruiser,\r
112                 checkBoxSTypeLightCruiser,\r
113                 checkBoxSTypeDestroyer,\r
114                 checkBoxSTypeEscort,\r
115                 checkBoxSTypeSubmarine,\r
116                 checkBoxSTypeAuxiliary\r
117             };\r
118             battleResultPanel.HpLabelClick += ToggleHpPercent;\r
119             shipListPanel.HpLabelClick += ToggleHpPercent;\r
120             var swipe = new SwipeScrollify();\r
121             swipe.AddShipListPanel(shipListPanel);\r
122             swipe.AddTreeView(itemTreeView);\r
123             swipe.AddPanel(fleetPanel);\r
124         }\r
125 \r
126         public void UpdateList()\r
127         {\r
128             if (_settings == null)\r
129                 return;\r
130             SetHeaderVisibility();\r
131             SetPanelVisibility();\r
132             if (InItemList)\r
133             {\r
134                 itemTreeView.SetNodes(_sniffer.ItemList);\r
135             }\r
136             else if (InFleetInfo)\r
137             {\r
138                 fleetPanel.Update(_sniffer);\r
139             }\r
140             else if (InAntiAir)\r
141             {\r
142                 antiAirPanel.Update(_sniffer);\r
143             }\r
144             else if (InMiscText)\r
145             {\r
146                 richTextBoxMiscText.Text = _sniffer.MiscText;\r
147             }\r
148             else if (InShipStatus || InGroupConfig || InRepairList)\r
149             {\r
150                 SetHeaderSortOrder();\r
151                 shipListPanel.Update(_sniffer, comboBoxGroup.Text, _settings);\r
152             }\r
153             if (shipListPanel.GroupUpdated)\r
154             {\r
155                 StoreShipGroupToConfig();\r
156                 _config.Save();\r
157                 shipListPanel.GroupUpdated = false;\r
158             }\r
159         }\r
160 \r
161         private void SetHeaderVisibility()\r
162         {\r
163             static void Set(Control header, bool visible)\r
164             {\r
165                 header.Visible = visible;\r
166                 if (visible)\r
167                     header.BringToFront();\r
168             }\r
169 \r
170             Set(panelShipHeader, InShipStatus);\r
171             Set(panelGroupHeader, InGroupConfig);\r
172             Set(panelRepairHeader, InRepairList);\r
173             Set(panelFleetHeader, InFleetInfo);\r
174             SetSTypeDropDownVisible(InShipStatus || InRepairList);\r
175         }\r
176 \r
177         private void SetPanelVisibility()\r
178         {\r
179             static void Set(Control panel, bool visible)\r
180             {\r
181                 // SwipeScrollifyが誤作動するのでEnabledも切り替える\r
182                 panel.Visible = panel.Enabled = visible;\r
183             }\r
184 \r
185             Set(shipListPanel, InShipStatus || InGroupConfig || InRepairList);\r
186             Set(itemTreeView, InItemList);\r
187             Set(fleetPanel, InFleetInfo);\r
188             Set(antiAirPanel, InAntiAir);\r
189             Set(airBattleResultPanel, InBattleResult);\r
190             Set(battleResultPanel, InBattleResult);\r
191             Set(richTextBoxMiscText, InMiscText);\r
192         }\r
193 \r
194         public void UpdateAirBattleResult()\r
195         {\r
196             airBattleResultPanel.ShowResultAutomatic = (_config.Spoilers & Spoiler.AirBattleResult) != 0;\r
197             airBattleResultPanel.SetResult(_sniffer);\r
198         }\r
199 \r
200         public void UpdateBattleResult()\r
201         {\r
202             MoveToBattleResult();\r
203             battleResultPanel.Spoilers = _config.Spoilers;\r
204             battleResultPanel.Update(_sniffer);\r
205             BackFromBattleResult();\r
206         }\r
207 \r
208         private int _prevSelectedIndex = -1;\r
209         private const int BattleResultIndex = 10;\r
210 \r
211         private void MoveToBattleResult()\r
212         {\r
213             if (!_isMaster || !_config.ShipList.AutoBattleResult || comboBoxGroup.SelectedIndex == BattleResultIndex ||\r
214                 _sniffer.InSortie == -1)\r
215                 return;\r
216             _prevSelectedIndex = comboBoxGroup.SelectedIndex;\r
217             comboBoxGroup.SelectedIndex = BattleResultIndex;\r
218         }\r
219 \r
220         private void BackFromBattleResult()\r
221         {\r
222             if (_sniffer.InSortie != -1 || _prevSelectedIndex == -1)\r
223                 return;\r
224             comboBoxGroup.SelectedIndex = _prevSelectedIndex;\r
225             _prevSelectedIndex = -1;\r
226         }\r
227 \r
228         public void UpdateCellInfo()\r
229         {\r
230             MoveToBattleResult();\r
231             battleResultPanel.Spoilers = _config.Spoilers;\r
232             battleResultPanel.UpdateCellInfo(_sniffer.CellInfo);\r
233         }\r
234 \r
235         private void SetHeaderSortOrder()\r
236         {\r
237             switch (_settings.SortOrder)\r
238             {\r
239                 case SortOrder.None:\r
240                     labelHeaderCond.Text = "cond";\r
241                     labelHeaderExp.Text = "Exp";\r
242                     break;\r
243                 case SortOrder.CondAscend:\r
244                     labelHeaderCond.Text = "cond▴";\r
245                     labelHeaderExp.Text = "Exp";\r
246                     break;\r
247                 case SortOrder.CondDescend:\r
248                     labelHeaderCond.Text = "cond▾";\r
249                     labelHeaderExp.Text = "Exp";\r
250                     break;\r
251                 case SortOrder.ExpToNextAscend:\r
252                     labelHeaderCond.Text = "cond";\r
253                     labelHeaderExp.Text = "Exp▴";\r
254                     break;\r
255                 case SortOrder.ExpToNextDescend:\r
256                     labelHeaderCond.Text = "cond";\r
257                     labelHeaderExp.Text = "Exp▾";\r
258                     break;\r
259             }\r
260         }\r
261 \r
262         private bool InShipStatus => Array.Exists(new[] {"全艦", "A", "B", "C", "D"}, x => _settings.Mode == x);\r
263 \r
264         private bool InGroupConfig => _settings.Mode == "分類";\r
265 \r
266         private bool InRepairList => _settings.Mode == "修復";\r
267 \r
268         private bool InItemList => _settings.Mode == "装備";\r
269 \r
270         private bool InFleetInfo => _settings.Mode == "艦隊";\r
271 \r
272         private bool InAntiAir => _settings.Mode == "対空";\r
273 \r
274         private bool InBattleResult => _settings.Mode == "戦況";\r
275 \r
276         private bool InMiscText => _settings.Mode == "情報";\r
277 \r
278         private void ListForm_Load(object sender, EventArgs e)\r
279         {\r
280             AdjustHeader();\r
281             SetMinimumSize();\r
282             var config = GetConfig();\r
283             _settings = Settings.FromShipListConfig(config);\r
284             if (_settings.ShowHpInPercent)\r
285             {\r
286                 shipListPanel.ToggleHpPercent();\r
287                 battleResultPanel.ToggleHpPercent();\r
288             }\r
289             LoadShipGroupFromConfig();\r
290             comboBoxGroup.SelectedItem = _settings.Mode;\r
291             SetCheckBoxSTypeState();\r
292             if (config.Location.X == int.MinValue)\r
293                 return;\r
294             var bounds = new Rectangle(config.Location, config.Size);\r
295             if (MainWindow.IsTitleBarOnAnyScreen(bounds.Location))\r
296                 Location = bounds.Location;\r
297             Size = bounds.Size;\r
298         }\r
299 \r
300         private void AdjustHeader()\r
301         {\r
302             if (_config.Zoom == 100)\r
303                 return;\r
304             foreach (var header in new[]\r
305             {\r
306                 panelShipHeader, panelGroupHeader, panelRepairHeader\r
307             })\r
308             {\r
309                 header.Left += SystemInformation.VerticalScrollBarWidth * (_config.Zoom - 100) / 100;\r
310             }\r
311         }\r
312 \r
313         private void SetMinimumSize()\r
314         {\r
315             MinimumSize = new Size(Width - Scaler.ScaleWidth(24) - SystemInformation.VerticalScrollBarWidth * (_config.Zoom - 100) / 100, 0);\r
316         }\r
317 \r
318         private ShipListConfig GetConfig()\r
319         {\r
320             if (_isMaster || _config.ListFormGroup.Count == 0)\r
321                 return _config.ShipList;\r
322             var config = _config.ListFormGroup[0];\r
323             _config.ListFormGroup.RemoveAt(0);\r
324             if (config.Mode == "分類")\r
325                 config.Mode = "全艦";\r
326             return config;\r
327         }\r
328 \r
329         private void LoadShipGroupFromConfig()\r
330         {\r
331             var group = _config.ShipList.ShipGroup;\r
332             for (var i = 0; i < GroupConfigLabels.GroupCount; i++)\r
333                 shipListPanel.GroupSettings[i] = i < group.Count ? new HashSet<int>(group[i]) : new HashSet<int>();\r
334         }\r
335 \r
336         private void SetCheckBoxSTypeState()\r
337         {\r
338             for (var type = 0; type < _shipTypeCheckBoxes.Length; type++)\r
339                 _shipTypeCheckBoxes[type].Checked = ((int)_settings.ShipCategories & (1 << type)) != 0;\r
340             checkBoxSTypeAll.Checked = _settings.ShipCategories == ShipCategory.All;\r
341             checkBoxSTypeDetails.Checked = _settings.ShipType;\r
342         }\r
343 \r
344         private void ListForm_FormClosing(object sender, FormClosingEventArgs e)\r
345         {\r
346             e.Cancel = true;\r
347             Hide();\r
348         }\r
349 \r
350         public void SaveConfig()\r
351         {\r
352             if (_settings == null)\r
353                 return;\r
354             if (_isMaster)\r
355             {\r
356                 SaveMasterState();\r
357             }\r
358             else\r
359             {\r
360                 SaveSlaveState();\r
361             }\r
362         }\r
363 \r
364         private void SaveMasterState()\r
365         {\r
366             StoreShipGroupToConfig();\r
367             var config = _config.ShipList;\r
368             config.Visible = Visible && WindowState == FormWindowState.Normal;\r
369             _settings.SetToShipListConfig(config);\r
370             if (!Visible)\r
371                 return;\r
372             SaveBounds(config); // 最小化時は以前のサイズを記録する\r
373         }\r
374 \r
375         private void SaveSlaveState()\r
376         {\r
377             if (!Visible)\r
378                 return;\r
379             if (WindowState != FormWindowState.Normal) // 最小化時は次回復旧しない\r
380                 return;\r
381             var config = new ShipListConfig {Visible = true};\r
382             _settings.SetToShipListConfig(config);\r
383             _config.ListFormGroup.Add(config);\r
384             SaveBounds(config);\r
385         }\r
386 \r
387         private void SaveBounds(ShipListConfig config)\r
388         {\r
389             var bounds = WindowState == FormWindowState.Normal ? Bounds : RestoreBounds;\r
390             config.Location = bounds.Location;\r
391             config.Size = bounds.Size;\r
392         }\r
393 \r
394         public void ChangeWindowState(FormWindowState newState)\r
395         {\r
396             if (!Visible)\r
397                 return;\r
398             if (newState == FormWindowState.Minimized)\r
399             {\r
400                 if (WindowState == FormWindowState.Normal)\r
401                     WindowState = FormWindowState.Minimized;\r
402                 if (_config.HideOnMinimized)\r
403                     ShowInTaskbar = false;\r
404             }\r
405             else\r
406             {\r
407                 if (WindowState == FormWindowState.Minimized)\r
408                 {\r
409                     Application.DoEvents();\r
410                     if (_config.HideOnMinimized)\r
411                         ShowInTaskbar = true;\r
412                     WindowState = FormWindowState.Normal;\r
413                 }\r
414             }\r
415         }\r
416 \r
417         private void ListForm_Activated(object sender, EventArgs e)\r
418         {\r
419             if (!_isMaster)\r
420                 return;\r
421             if (_suppressActivate.Check())\r
422                 return;\r
423             if (WindowState == FormWindowState.Minimized)\r
424                 return;\r
425             RaiseBothWindows();\r
426         }\r
427 \r
428         private void RaiseBothWindows()\r
429         {\r
430             _form.Owner = null;\r
431             Owner = _form;\r
432             BringToFront();\r
433             Owner = null;\r
434         }\r
435 \r
436         private void StoreShipGroupToConfig()\r
437         {\r
438             var all = _sniffer.ShipList.Select(s => s.Id).ToArray();\r
439             var group = _config.ShipList.ShipGroup;\r
440             group.Clear();\r
441             for (var i = 0; i < GroupConfigLabels.GroupCount; i++)\r
442             {\r
443                 if (all.Length > 0)\r
444                     shipListPanel.GroupSettings[i].IntersectWith(all);\r
445                 group.Add(shipListPanel.GroupSettings[i].ToList());\r
446             }\r
447         }\r
448 \r
449         public void ShowShip(int id)\r
450         {\r
451             if (InShipStatus)\r
452             {\r
453                 shipListPanel.ShowShip(id);\r
454             }\r
455             else if (InFleetInfo)\r
456             {\r
457                 fleetPanel.ShowShip(id);\r
458             }\r
459             else if (InAntiAir)\r
460             {\r
461                 antiAirPanel.ShowShip(id);\r
462             }\r
463         }\r
464 \r
465         private void comboBoxGroup_DropDownClosed(object sender, EventArgs e)\r
466         {\r
467             SetActiveControl();\r
468         }\r
469 \r
470         private void comboBoxGroup_SelectedIndexChanged(object sender, EventArgs e)\r
471         {\r
472             if (_settings == null)\r
473                 return;\r
474             _settings.Mode = comboBoxGroup.Text;\r
475             UpdateList();\r
476             SetActiveControl();\r
477             if (!(InShipStatus || InGroupConfig || InRepairList))\r
478                 SetPanelSTypeState(false);\r
479         }\r
480 \r
481         private void ListForm_KeyPress(object sender, KeyPressEventArgs e)\r
482         {\r
483             var g = Array.FindIndex(PanelKeys, x => x == char.ToUpper(e.KeyChar));\r
484             if (g == -1)\r
485                 return;\r
486             comboBoxGroup.SelectedIndex = g;\r
487             e.Handled = true;\r
488         }\r
489 \r
490         // マウスホイールでスクロールするためにコントロールにフォーカスを合わせる。\r
491         private void SetActiveControl()\r
492         {\r
493             if (InItemList)\r
494             {\r
495                 ActiveControl = itemTreeView;\r
496             }\r
497             else if (InFleetInfo)\r
498             {\r
499                 ActiveControl = fleetPanel;\r
500             }\r
501             else if (InAntiAir)\r
502             {\r
503                 ActiveControl = antiAirPanel;\r
504             }\r
505             else\r
506             {\r
507                 ActiveControl = shipListPanel;\r
508             }\r
509         }\r
510 \r
511         private void itemCsvToolStripMenuItem_Click(object sender, EventArgs e)\r
512         {\r
513             Clipboard.SetText(TextGenerator.GenerateItemList(_sniffer.ItemList));\r
514         }\r
515 \r
516         private void kantaiBunsekiToolStripMenuItem_Click(object sender, EventArgs e)\r
517         {\r
518             Clipboard.SetText(TextGenerator.GenerateKantaiBunsekiItemList(_sniffer.ItemList));\r
519         }\r
520 \r
521         private void fleetTextToolStripMenuItem_Click(object sender, EventArgs e)\r
522         {\r
523             Clipboard.SetText(TextGenerator.GenerateFleetData(_sniffer));\r
524         }\r
525 \r
526         private void deckBuilderToolStripMenuItem_Click(object sender, EventArgs e)\r
527         {\r
528             Clipboard.SetText(TextGenerator.GenerateDeckBuilderData(_sniffer));\r
529         }\r
530 \r
531         private void labelHeaderCond_Click(object sender, EventArgs e)\r
532         {\r
533             switch (_settings.SortOrder)\r
534             {\r
535                 case SortOrder.CondAscend:\r
536                     _settings.SortOrder = SortOrder.CondDescend;\r
537                     break;\r
538                 case SortOrder.CondDescend:\r
539                     _settings.SortOrder = SortOrder.None;\r
540                     break;\r
541                 default:\r
542                     _settings.SortOrder = SortOrder.CondAscend;\r
543                     break;\r
544             }\r
545             UpdateList();\r
546         }\r
547 \r
548         private void labelHeaderExp_Click(object sender, EventArgs e)\r
549         {\r
550             switch (_settings.SortOrder)\r
551             {\r
552                 case SortOrder.ExpToNextAscend:\r
553                     _settings.SortOrder = SortOrder.ExpToNextDescend;\r
554                     break;\r
555                 case SortOrder.ExpToNextDescend:\r
556                     _settings.SortOrder = SortOrder.None;\r
557                     break;\r
558                 default:\r
559                     _settings.SortOrder = SortOrder.ExpToNextAscend;\r
560                     break;\r
561             }\r
562             UpdateList();\r
563         }\r
564 \r
565         private void shipCsvToolStripMenuItem_Click(object sender, EventArgs e)\r
566         {\r
567             Clipboard.SetText(TextGenerator.GenerateShipList(shipListPanel.CurrentShipList));\r
568         }\r
569 \r
570         private void kantaiSarashiToolStripMenuItem_Click(object sender, EventArgs e)\r
571         {\r
572             Clipboard.SetText(TextGenerator.GenerateKantaiSarashiData(shipListPanel.CurrentShipList));\r
573         }\r
574 \r
575         private void labelFleet_Click(object sender, EventArgs e)\r
576         {\r
577             fleetPanel.ShowFleet(((Control)sender).Text);\r
578         }\r
579 \r
580         private void labelHeaderHp_Click(object sender, EventArgs e)\r
581         {\r
582             ToggleHpPercent();\r
583         }\r
584 \r
585         private void ToggleHpPercent()\r
586         {\r
587             _settings.ShowHpInPercent = !_settings.ShowHpInPercent;\r
588             shipListPanel.ToggleHpPercent();\r
589             battleResultPanel.ToggleHpPercent();\r
590         }\r
591 \r
592         private void SetSTypeDropDownVisible(bool visible)\r
593         {\r
594             if (!visible)\r
595                 SetPanelSTypeState(false);\r
596             dropDownButtonSType.Visible = visible;\r
597             labelSType.Visible = visible;\r
598         }\r
599 \r
600         private void labelSTypeButton_Click(object sender, EventArgs e)\r
601         {\r
602             SetPanelSTypeState(!panelSType.Visible);\r
603         }\r
604 \r
605         private void checkBoxSType_Click(object sender, EventArgs e)\r
606         {\r
607             _settings.ShipCategories = SelectedShipTypes;\r
608             UpdateList();\r
609             SetActiveControl();\r
610         }\r
611 \r
612         private ShipCategory SelectedShipTypes =>\r
613             (ShipCategory)_shipTypeCheckBoxes.Select((cb, type) => cb.Checked ? 1 << type : 0).Sum();\r
614 \r
615         private void checkBoxSTypeAll_Click(object sender, EventArgs e)\r
616         {\r
617             foreach (var checkBox in _shipTypeCheckBoxes)\r
618                 checkBox.Checked = checkBoxSTypeAll.Checked;\r
619             checkBoxSType_Click(sender, e);\r
620         }\r
621 \r
622         private void panelSType_Click(object sender, EventArgs e)\r
623         {\r
624             SetPanelSTypeState(false);\r
625         }\r
626 \r
627         private void SetPanelSTypeState(bool visible)\r
628         {\r
629             panelSType.Visible = visible;\r
630             if (visible)\r
631                 panelSType.BringToFront();\r
632             dropDownButtonSType.BackColor = visible ? CustomColors.ActiveButtonColor : DefaultBackColor;\r
633         }\r
634 \r
635         private void checkBoxSTypeDetails_Click(object sender, EventArgs e)\r
636         {\r
637             _settings.ShipType = checkBoxSTypeDetails.Checked;\r
638             UpdateList();\r
639             SetActiveControl();\r
640         }\r
641 \r
642         private void ListForm_ResizeEnd(object sender, EventArgs e)\r
643         {\r
644             foreach (var panel in new IPanelResize[] {shipListPanel, antiAirPanel, airBattleResultPanel, battleResultPanel, fleetPanel})\r
645             {\r
646                 if (panel.Visible)\r
647                     panel.ApplyResize();\r
648             }\r
649         }\r
650     }\r
651 }