OSDN Git Service

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