OSDN Git Service

panelShipInfo上の要素をShipInfoPanelに分離する
authorKazuhiro Fujieda <fujieda@users.osdn.me>
Sun, 12 Apr 2020 12:16:51 +0000 (21:16 +0900)
committerKazuhiro Fujieda <fujieda@users.osdn.me>
Sun, 30 Aug 2020 05:58:21 +0000 (14:58 +0900)
KancolleSniffer/KancolleSniffer.csproj
KancolleSniffer/MainForm.Designer.cs
KancolleSniffer/MainForm.cs
KancolleSniffer/View/ShipInfoPanel.cs [new file with mode: 0644]

index ed478fe..9683136 100644 (file)
@@ -87,6 +87,9 @@
     <Compile Include="View\MaterialHistoryPanel.cs">\r
       <SubType>Component</SubType>\r
     </Compile>\r
+    <Compile Include="View\ShipInfoPanel.cs">\r
+      <SubType>Component</SubType>\r
+    </Compile>\r
     <Compile Include="View\UpdateContext.cs" />\r
     <Compile Include="View\AntiAirPanel.cs">\r
       <SubType>Component</SubType>\r
index ffa0fdd..4758b01 100644 (file)
@@ -46,22 +46,6 @@ namespace KancolleSniffer
         {\r
             this.components = new System.ComponentModel.Container();\r
             System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));\r
-            this.panelShipInfo = new System.Windows.Forms.Panel();\r
-            this.labelPresetAkashiTimer = new System.Windows.Forms.Label();\r
-            this.linkLabelGuide = new System.Windows.Forms.LinkLabel();\r
-            this.panelCombinedFleet = new System.Windows.Forms.Panel();\r
-            this.panel7Ships = new System.Windows.Forms.Panel();\r
-            this.panelBattleInfo = new System.Windows.Forms.Panel();\r
-            this.labelEnemyFighterPower = new System.Windows.Forms.Label();\r
-            this.labelEnemyFighterPowerCaption = new System.Windows.Forms.Label();\r
-            this.labelFormation = new System.Windows.Forms.Label();\r
-            this.labelResultRank = new System.Windows.Forms.Label();\r
-            this.labelLoS = new System.Windows.Forms.Label();\r
-            this.labelLoSCaption = new System.Windows.Forms.Label();\r
-            this.labelFighterPower = new System.Windows.Forms.Label();\r
-            this.labelFighterPowerCaption = new System.Windows.Forms.Label();\r
-            this.labelCondTimerTitle = new System.Windows.Forms.Label();\r
-            this.labelCondTimer = new System.Windows.Forms.Label();\r
             this.labelAkashiRepairTimer = new System.Windows.Forms.Label();\r
             this.labelNDockCaption = new System.Windows.Forms.Label();\r
             this.labelConstruct = new System.Windows.Forms.Label();\r
@@ -110,161 +94,11 @@ namespace KancolleSniffer
             this.questPanel = new KancolleSniffer.View.QuestPanel();\r
             this.hqPanel = new KancolleSniffer.View.HqPanel();\r
             this.materialHistoryPanel = new KancolleSniffer.View.MaterialHistoryPanel();\r
-            this.panelShipInfo.SuspendLayout();\r
-            this.panelBattleInfo.SuspendLayout();\r
+            this.shipInfoPanel = new KancolleSniffer.View.ShipInfoPanel();\r
             this.contextMenuStripNotifyIcon.SuspendLayout();\r
             this.contextMenuStripMain.SuspendLayout();\r
             this.SuspendLayout();\r
             // \r
-            // panelShipInfo\r
-            // \r
-            this.panelShipInfo.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\r
-            this.panelShipInfo.Controls.Add(this.labelPresetAkashiTimer);\r
-            this.panelShipInfo.Controls.Add(this.linkLabelGuide);\r
-            this.panelShipInfo.Controls.Add(this.panelCombinedFleet);\r
-            this.panelShipInfo.Controls.Add(this.panel7Ships);\r
-            this.panelShipInfo.Controls.Add(this.panelBattleInfo);\r
-            this.panelShipInfo.Controls.Add(this.labelLoS);\r
-            this.panelShipInfo.Controls.Add(this.labelLoSCaption);\r
-            this.panelShipInfo.Controls.Add(this.labelFighterPower);\r
-            this.panelShipInfo.Controls.Add(this.labelFighterPowerCaption);\r
-            this.panelShipInfo.Controls.Add(this.labelCondTimerTitle);\r
-            this.panelShipInfo.Controls.Add(this.labelCondTimer);\r
-            this.panelShipInfo.Location = new System.Drawing.Point(6, 57);\r
-            this.panelShipInfo.Name = "panelShipInfo";\r
-            this.panelShipInfo.Size = new System.Drawing.Size(220, 134);\r
-            this.panelShipInfo.TabIndex = 2;\r
-            // \r
-            // labelPresetAkashiTimer\r
-            // \r
-            this.labelPresetAkashiTimer.Location = new System.Drawing.Point(2, 3);\r
-            this.labelPresetAkashiTimer.Name = "labelPresetAkashiTimer";\r
-            this.labelPresetAkashiTimer.Size = new System.Drawing.Size(32, 12);\r
-            this.labelPresetAkashiTimer.TabIndex = 55;\r
-            // \r
-            // linkLabelGuide\r
-            // \r
-            this.linkLabelGuide.AutoSize = true;\r
-            this.linkLabelGuide.Font = new System.Drawing.Font("MS UI Gothic", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128)));\r
-            this.linkLabelGuide.LinkArea = new System.Windows.Forms.LinkArea(0, 0);\r
-            this.linkLabelGuide.Location = new System.Drawing.Point(31, 51);\r
-            this.linkLabelGuide.Name = "linkLabelGuide";\r
-            this.linkLabelGuide.Size = new System.Drawing.Size(158, 13);\r
-            this.linkLabelGuide.TabIndex = 44;\r
-            this.linkLabelGuide.Text = "右クリックでメニューが出ます。";\r
-            // \r
-            // panelCombinedFleet\r
-            // \r
-            this.panelCombinedFleet.Location = new System.Drawing.Point(0, 0);\r
-            this.panelCombinedFleet.Name = "panelCombinedFleet";\r
-            this.panelCombinedFleet.Size = new System.Drawing.Size(220, 113);\r
-            this.panelCombinedFleet.TabIndex = 43;\r
-            this.panelCombinedFleet.Visible = false;\r
-            // \r
-            // panel7Ships\r
-            // \r
-            this.panel7Ships.Location = new System.Drawing.Point(0, 0);\r
-            this.panel7Ships.Name = "panel7Ships";\r
-            this.panel7Ships.Size = new System.Drawing.Size(220, 115);\r
-            this.panel7Ships.TabIndex = 0;\r
-            this.panel7Ships.Visible = false;\r
-            // \r
-            // panelBattleInfo\r
-            // \r
-            this.panelBattleInfo.Controls.Add(this.labelEnemyFighterPower);\r
-            this.panelBattleInfo.Controls.Add(this.labelEnemyFighterPowerCaption);\r
-            this.panelBattleInfo.Controls.Add(this.labelFormation);\r
-            this.panelBattleInfo.Controls.Add(this.labelResultRank);\r
-            this.panelBattleInfo.Location = new System.Drawing.Point(59, 116);\r
-            this.panelBattleInfo.Name = "panelBattleInfo";\r
-            this.panelBattleInfo.Size = new System.Drawing.Size(157, 14);\r
-            this.panelBattleInfo.TabIndex = 40;\r
-            this.panelBattleInfo.Visible = false;\r
-            // \r
-            // labelEnemyFighterPower\r
-            // \r
-            this.labelEnemyFighterPower.Location = new System.Drawing.Point(129, 1);\r
-            this.labelEnemyFighterPower.Name = "labelEnemyFighterPower";\r
-            this.labelEnemyFighterPower.Size = new System.Drawing.Size(29, 12);\r
-            this.labelEnemyFighterPower.TabIndex = 3;\r
-            this.labelEnemyFighterPower.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\r
-            // \r
-            // labelEnemyFighterPowerCaption\r
-            // \r
-            this.labelEnemyFighterPowerCaption.AutoSize = true;\r
-            this.labelEnemyFighterPowerCaption.Location = new System.Drawing.Point(90, 1);\r
-            this.labelEnemyFighterPowerCaption.Name = "labelEnemyFighterPowerCaption";\r
-            this.labelEnemyFighterPowerCaption.Size = new System.Drawing.Size(41, 12);\r
-            this.labelEnemyFighterPowerCaption.TabIndex = 2;\r
-            this.labelEnemyFighterPowerCaption.Text = "敵制空";\r
-            // \r
-            // labelFormation\r
-            // \r
-            this.labelFormation.Location = new System.Drawing.Point(40, 1);\r
-            this.labelFormation.Name = "labelFormation";\r
-            this.labelFormation.Size = new System.Drawing.Size(48, 12);\r
-            this.labelFormation.TabIndex = 1;\r
-            // \r
-            // labelResultRank\r
-            // \r
-            this.labelResultRank.Location = new System.Drawing.Point(1, 1);\r
-            this.labelResultRank.Name = "labelResultRank";\r
-            this.labelResultRank.Size = new System.Drawing.Size(42, 12);\r
-            this.labelResultRank.TabIndex = 0;\r
-            this.labelResultRank.Text = "判定";\r
-            this.labelResultRank.Click += new System.EventHandler(this.labelResultRank_Click);\r
-            // \r
-            // labelLoS\r
-            // \r
-            this.labelLoS.Location = new System.Drawing.Point(85, 117);\r
-            this.labelLoS.Name = "labelLoS";\r
-            this.labelLoS.Size = new System.Drawing.Size(38, 12);\r
-            this.labelLoS.TabIndex = 42;\r
-            this.labelLoS.Text = "0.0";\r
-            this.labelLoS.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\r
-            // \r
-            // labelLoSCaption\r
-            // \r
-            this.labelLoSCaption.AutoSize = true;\r
-            this.labelLoSCaption.Location = new System.Drawing.Point(59, 117);\r
-            this.labelLoSCaption.Name = "labelLoSCaption";\r
-            this.labelLoSCaption.Size = new System.Drawing.Size(29, 12);\r
-            this.labelLoSCaption.TabIndex = 41;\r
-            this.labelLoSCaption.Text = "索敵";\r
-            // \r
-            // labelFighterPower\r
-            // \r
-            this.labelFighterPower.Location = new System.Drawing.Point(28, 117);\r
-            this.labelFighterPower.Name = "labelFighterPower";\r
-            this.labelFighterPower.Size = new System.Drawing.Size(29, 12);\r
-            this.labelFighterPower.TabIndex = 23;\r
-            this.labelFighterPower.Text = "0";\r
-            this.labelFighterPower.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\r
-            // \r
-            // labelFighterPowerCaption\r
-            // \r
-            this.labelFighterPowerCaption.AutoSize = true;\r
-            this.labelFighterPowerCaption.Location = new System.Drawing.Point(2, 117);\r
-            this.labelFighterPowerCaption.Name = "labelFighterPowerCaption";\r
-            this.labelFighterPowerCaption.Size = new System.Drawing.Size(29, 12);\r
-            this.labelFighterPowerCaption.TabIndex = 23;\r
-            this.labelFighterPowerCaption.Text = "制空";\r
-            // \r
-            // labelCondTimerTitle\r
-            // \r
-            this.labelCondTimerTitle.Location = new System.Drawing.Point(128, 117);\r
-            this.labelCondTimerTitle.Name = "labelCondTimerTitle";\r
-            this.labelCondTimerTitle.Size = new System.Drawing.Size(60, 12);\r
-            this.labelCondTimerTitle.TabIndex = 39;\r
-            // \r
-            // labelCondTimer\r
-            // \r
-            this.labelCondTimer.AutoSize = true;\r
-            this.labelCondTimer.Location = new System.Drawing.Point(186, 117);\r
-            this.labelCondTimer.Name = "labelCondTimer";\r
-            this.labelCondTimer.Size = new System.Drawing.Size(0, 12);\r
-            this.labelCondTimer.TabIndex = 38;\r
-            // \r
             // labelAkashiRepairTimer\r
             // \r
             this.labelAkashiRepairTimer.Location = new System.Drawing.Point(179, 276);\r
@@ -694,12 +528,26 @@ namespace KancolleSniffer
             this.materialHistoryPanel.TabIndex = 65;\r
             this.materialHistoryPanel.Visible = false;\r
             // \r
+            // shipInfoPanel\r
+            // \r
+            this.shipInfoPanel.AkashiRepairTimer = null;\r
+            this.shipInfoPanel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\r
+            this.shipInfoPanel.CombinedFleet = false;\r
+            this.shipInfoPanel.Context = null;\r
+            this.shipInfoPanel.CurrentFleet = 0;\r
+            this.shipInfoPanel.Location = new System.Drawing.Point(6, 57);\r
+            this.shipInfoPanel.Name = "shipInfoPanel";\r
+            this.shipInfoPanel.ShowShipOnList = null;\r
+            this.shipInfoPanel.Size = new System.Drawing.Size(220, 134);\r
+            this.shipInfoPanel.TabIndex = 67;\r
+            // \r
             // MainForm\r
             // \r
             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r
             this.ClientSize = new System.Drawing.Size(232, 456);\r
             this.ContextMenuStrip = this.contextMenuStripMain;\r
+            this.Controls.Add(this.shipInfoPanel);\r
             this.Controls.Add(this.materialHistoryPanel);\r
             this.Controls.Add(this.hqPanel);\r
             this.Controls.Add(this.kdockPanel);\r
@@ -734,7 +582,6 @@ namespace KancolleSniffer
             this.Controls.Add(this.labelQuest);\r
             this.Controls.Add(this.labelConstruct);\r
             this.Controls.Add(this.labelNDockCaption);\r
-            this.Controls.Add(this.panelShipInfo);\r
             this.Controls.Add(this.labelFleet1);\r
             this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;\r
             this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));\r
@@ -746,10 +593,6 @@ namespace KancolleSniffer
             this.Load += new System.EventHandler(this.MainForm_Load);\r
             this.Shown += new System.EventHandler(this.MainForm_Shown);\r
             this.Resize += new System.EventHandler(this.MainForm_Resize);\r
-            this.panelShipInfo.ResumeLayout(false);\r
-            this.panelShipInfo.PerformLayout();\r
-            this.panelBattleInfo.ResumeLayout(false);\r
-            this.panelBattleInfo.PerformLayout();\r
             this.contextMenuStripNotifyIcon.ResumeLayout(false);\r
             this.contextMenuStripMain.ResumeLayout(false);\r
             this.ResumeLayout(false);\r
@@ -758,14 +601,11 @@ namespace KancolleSniffer
         }\r
 \r
         #endregion\r
-        private System.Windows.Forms.Panel panelShipInfo;\r
         private System.Windows.Forms.Label labelNDockCaption;\r
         private System.Windows.Forms.Label labelConstruct;\r
         private System.Windows.Forms.Label labelQuest;\r
         private System.Windows.Forms.Label labelMissionCaption;\r
         private System.Windows.Forms.Timer timerMain;\r
-        private System.Windows.Forms.Label labelCondTimerTitle;\r
-        private System.Windows.Forms.Label labelCondTimer;\r
         private System.Windows.Forms.NotifyIcon notifyIconMain;\r
         private System.Windows.Forms.ContextMenuStrip contextMenuStripMain;\r
         private System.Windows.Forms.ToolStripMenuItem ConfigToolStripMenuItem;\r
@@ -778,8 +618,6 @@ namespace KancolleSniffer
         private System.Windows.Forms.Label labelFleet3;\r
         private System.Windows.Forms.Label labelCheckFleet2;\r
         private System.Windows.Forms.Label labelFleet2;\r
-        private System.Windows.Forms.Label labelFighterPower;\r
-        private System.Windows.Forms.Label labelFighterPowerCaption;\r
         private System.Windows.Forms.Label labelMaterialCaption;\r
         private System.Windows.Forms.Label labelMaterialHistoryButton;\r
         private System.Windows.Forms.Label labelRepairListButton;\r
@@ -788,13 +626,6 @@ namespace KancolleSniffer
         private System.Windows.Forms.ToolStripMenuItem NotifyIconOpenToolStripMenuItem;\r
         private System.Windows.Forms.ToolStripMenuItem NotifyIconExitToolStripMenuItem;\r
         private System.Windows.Forms.ToolStripMenuItem listToolStripMenuItem;\r
-        private System.Windows.Forms.Label labelLoS;\r
-        private System.Windows.Forms.Label labelLoSCaption;\r
-        private System.Windows.Forms.Panel panelBattleInfo;\r
-        private System.Windows.Forms.Label labelEnemyFighterPower;\r
-        private System.Windows.Forms.Label labelEnemyFighterPowerCaption;\r
-        private System.Windows.Forms.Label labelFormation;\r
-        private System.Windows.Forms.Label labelResultRank;\r
         private System.Windows.Forms.ImageList imageListFuelSq;\r
         private System.Windows.Forms.Label labelFuelSq1;\r
         private System.Windows.Forms.ImageList imageListBullSq;\r
@@ -808,12 +639,8 @@ namespace KancolleSniffer
         private System.Windows.Forms.ToolStripMenuItem LogToolStripMenuItem;\r
         private System.Windows.Forms.ToolStripMenuItem CaptureToolStripMenuItem;\r
         private System.Windows.Forms.Label labelAkashiRepairTimer;\r
-        private System.Windows.Forms.Panel panelCombinedFleet;\r
         private System.Windows.Forms.Label labelAkashiRepair;\r
-        private System.Windows.Forms.Label labelPresetAkashiTimer;\r
         private RepairListForMain panelRepairList;\r
-        private System.Windows.Forms.Panel panel7Ships;\r
-        private System.Windows.Forms.LinkLabel linkLabelGuide;\r
         private System.Windows.Forms.Label labelClearQuest;\r
         private QuestPanel questPanel;\r
         private System.Windows.Forms.Label labelQuestCount;\r
@@ -822,6 +649,7 @@ namespace KancolleSniffer
         private KDockPanel kdockPanel;\r
         private HqPanel hqPanel;\r
         private MaterialHistoryPanel materialHistoryPanel;\r
+        private ShipInfoPanel shipInfoPanel;\r
     }\r
 }\r
 \r
index 4cf4600..9d8c1fc 100644 (file)
@@ -34,7 +34,6 @@ using KancolleSniffer.Net;
 using KancolleSniffer.Util;\r
 using KancolleSniffer.View;\r
 using Microsoft.CSharp.RuntimeBinder;\r
-using static System.Math;\r
 using Clipboard = KancolleSniffer.Util.Clipboard;\r
 using Timer = System.Windows.Forms.Timer;\r
 \r
@@ -46,9 +45,6 @@ namespace KancolleSniffer
         private readonly ProxyManager _proxyManager;\r
         private readonly ResizableToolTip _toolTip = new ResizableToolTip();\r
         private readonly ResizableToolTip _tooltipCopy = new ResizableToolTip {ShowAlways = false, AutomaticDelay = 0};\r
-        private int _currentFleet;\r
-        private bool _combinedFleet;\r
-        private readonly MainShipLabels _mainLabels = new MainShipLabels();\r
         private readonly ListFormGroup _listFormGroup;\r
 \r
         private readonly NotificationManager _notificationManager;\r
@@ -92,9 +88,9 @@ namespace KancolleSniffer
         {\r
             SetScaleFactorOfDpiScaling();\r
             SetupFleetClick();\r
-            CreateMainLabels();\r
-            labelPresetAkashiTimer.BackColor = CustomColors.ColumnColors.Bright;\r
             SetupQuestPanel();\r
+            shipInfoPanel.AkashiRepairTimer = labelAkashiRepairTimer;\r
+            shipInfoPanel.ShowShipOnList = ShowShipOnShipList;\r
             panelRepairList.CreateLabels(panelRepairList_Click);\r
             ndockPanel.SetClickHandler(labelNDockCaption);\r
             missionPanel.SetClickHandler(labelMissionCaption);\r
@@ -105,11 +101,11 @@ namespace KancolleSniffer
 \r
         private void SetupUpdateable()\r
         {\r
-            _updateable = new IUpdateContext[] {hqPanel, missionPanel, kdockPanel, ndockPanel, materialHistoryPanel};\r
+            _updateable = new IUpdateContext[] {hqPanel, missionPanel, kdockPanel, ndockPanel, materialHistoryPanel, shipInfoPanel};\r
             var context = new UpdateContext(Sniffer, Config, new NotifySubmitter(_notificationManager), () => _now);\r
             foreach (var updateable in _updateable)\r
                 updateable.Context = context;\r
-            _timers = new IUpdateTimers[] {missionPanel, kdockPanel, ndockPanel};\r
+            _timers = new IUpdateTimers[] {missionPanel, kdockPanel, ndockPanel, shipInfoPanel};\r
         }\r
 \r
         private void SetScaleFactorOfDpiScaling()\r
@@ -126,16 +122,6 @@ namespace KancolleSniffer
             Height += questPanel.Height - prevHeight;\r
         }\r
 \r
-        private void CreateMainLabels()\r
-        {\r
-            _mainLabels.CreateAllShipLabels(new MainShipPanels\r
-            {\r
-                PanelShipInfo = panelShipInfo,\r
-                Panel7Ships = panel7Ships,\r
-                PanelCombinedFleet = panelCombinedFleet\r
-            }, ShowShipOnShipList);\r
-        }\r
-\r
         private class NotifySubmitter : INotifySubmitter\r
         {\r
             private readonly NotificationManager _manager;\r
@@ -162,11 +148,6 @@ namespace KancolleSniffer
         /// </summary>\r
         private void MainForm_Shown(object sender, EventArgs e)\r
         {\r
-            // ReSharper disable once NotAccessedVariable\r
-            IntPtr handle;\r
-            foreach (var panel in new[] {panelShipInfo, panel7Ships, panelCombinedFleet})\r
-                // ReSharper disable once RedundantAssignment\r
-                handle = panel.Handle;\r
         }\r
 \r
         private readonly FileSystemWatcher _watcher = new FileSystemWatcher\r
@@ -321,7 +302,7 @@ namespace KancolleSniffer
             if (update == Sniffer.Update.Start)\r
             {\r
                 hqPanel.Login.Visible = false;\r
-                linkLabelGuide.Visible = false;\r
+                shipInfoPanel.Guide.Visible = false;\r
                 _started = true;\r
                 _notificationManager.StopAllRepeat();\r
                 return;\r
@@ -355,7 +336,7 @@ namespace KancolleSniffer
             if (Config.HideOnMinimized && WindowState == FormWindowState.Minimized)\r
                 ShowInTaskbar = false;\r
             if (Config.ShowHpInPercent)\r
-                _mainLabels.ToggleHpPercent();\r
+                shipInfoPanel.ToggleHpPercent();\r
             if (Config.ShipList.Visible)\r
                 _listFormGroup.Show();\r
             ApplyConfig();\r
@@ -366,9 +347,10 @@ namespace KancolleSniffer
             {\r
                 if (latest == current)\r
                     return;\r
-                linkLabelGuide.Text = $"バージョン{latest}があります。";\r
-                linkLabelGuide.LinkArea = new LinkArea(0, linkLabelGuide.Text.Length);\r
-                linkLabelGuide.Click += (obj, ev) =>\r
+                var guide = shipInfoPanel.Guide;\r
+                guide.Text = $"バージョン{latest}があります。";\r
+                guide.LinkArea = new LinkArea(0, guide.Text.Length);\r
+                guide.Click += (obj, ev) =>\r
                 {\r
                     Process.Start("https://ja.osdn.net/rel/kancollesniffer/" + latest);\r
                 };\r
@@ -409,7 +391,7 @@ namespace KancolleSniffer
             _listFormGroup.Close();\r
             Sniffer.FlashLog();\r
             Config.Location = (WindowState == FormWindowState.Normal ? Bounds : RestoreBounds).Location;\r
-            Config.ShowHpInPercent = _mainLabels.ShowHpInPercent;\r
+            Config.ShowHpInPercent = shipInfoPanel.ShowHpInPercent;\r
             Config.Save();\r
             Sniffer.SaveState();\r
             _proxyManager.Shutdown();\r
@@ -428,7 +410,7 @@ namespace KancolleSniffer
             _listFormGroup.Main.ChangeWindowState(WindowState);\r
         }\r
 \r
-        public TimeOutChecker SuppressActivate = new TimeOutChecker();\r
+        public readonly TimeOutChecker SuppressActivate = new TimeOutChecker();\r
 \r
         private void MainForm_Activated(object sender, EventArgs e)\r
         {\r
@@ -511,7 +493,7 @@ namespace KancolleSniffer
             var prev = CurrentAutoScaleDimensions;\r
             foreach (var control in new Control[]\r
             {\r
-                this, linkLabelGuide, hqPanel.Login,\r
+                this, shipInfoPanel.Guide, hqPanel.Login,\r
                 _configDialog, _configDialog.NotificationConfigDialog,\r
                 contextMenuStripMain, _errorDialog\r
             })\r
@@ -555,8 +537,7 @@ namespace KancolleSniffer
             Sniffer.ItemCounter.Margin = Config.MarginEquips;\r
             hqPanel.Update();\r
             Sniffer.Achievement.ResetHours = Config.ResetHours;\r
-            labelAkashiRepair.Visible = labelAkashiRepairTimer.Visible =\r
-                labelPresetAkashiTimer.Visible = Config.UsePresetAkashi;\r
+            labelAkashiRepair.Visible = labelAkashiRepairTimer.Visible = Config.UsePresetAkashi;\r
             Sniffer.WarnBadDamageWithDameCon = Config.WarnBadDamageWithDameCon;\r
         }\r
 \r
@@ -636,19 +617,13 @@ namespace KancolleSniffer
             ProcessRequestMain(lines[0], lines[1], lines[2]);\r
         }\r
 \r
-        private void ShowShipOnShipList(object sender, EventArgs ev)\r
+        private void ShowShipOnShipList(int id)\r
         {\r
             if (!_listFormGroup.Visible)\r
                 return;\r
-            var idx = (int)((Control)sender).Tag;\r
-            var ship = (_combinedFleet\r
-                ? Sniffer.Fleets[0].Ships.Concat(Sniffer.Fleets[1].Ships).ToArray()\r
-                : Sniffer.Fleets[_currentFleet].Ships)[idx];\r
-            if (!ship.Empty)\r
-                _listFormGroup.ShowShip(ship.Id);\r
+            _listFormGroup.ShowShip(id);\r
         }\r
 \r
-\r
         private void UpdateItemInfo()\r
         {\r
             hqPanel.Update();\r
@@ -659,9 +634,8 @@ namespace KancolleSniffer
 \r
         private void UpdateShipInfo()\r
         {\r
-            SetCurrentFleet();\r
-            SetCombined();\r
-            UpdatePanelShipInfo();\r
+            shipInfoPanel.SetCurrentFleet();\r
+            shipInfoPanel.Update();\r
             NotifyDamagedShip();\r
             UpdateChargeInfo();\r
             UpdateRepairList();\r
@@ -670,75 +644,20 @@ namespace KancolleSniffer
                 _listFormGroup.UpdateList();\r
         }\r
 \r
-        private bool _inSortie;\r
-\r
-        private void SetCurrentFleet()\r
-        {\r
-            var inSortie = Sniffer.InSortie;\r
-            if (_inSortie || inSortie == -1)\r
-            {\r
-                _inSortie = inSortie != -1;\r
-                return;\r
-            }\r
-            _inSortie = true;\r
-            if (inSortie == 10)\r
-            {\r
-                _combinedFleet = true;\r
-                _currentFleet = 0;\r
-            }\r
-            else\r
-            {\r
-                _combinedFleet = false;\r
-                _currentFleet = inSortie;\r
-            }\r
-        }\r
-\r
-        private bool _prevCombined;\r
-\r
-        private void SetCombined()\r
-        {\r
-            if (Sniffer.IsCombinedFleet && !_prevCombined)\r
-            {\r
-                _combinedFleet = true;\r
-                _currentFleet = 0;\r
-            }\r
-            _prevCombined = Sniffer.IsCombinedFleet;\r
-        }\r
-\r
         private void UpdatePanelShipInfo()\r
         {\r
-            var ships = Sniffer.Fleets[_currentFleet].ActualShips;\r
-            panel7Ships.Visible = ships.Count == 7;\r
-            _mainLabels.SetShipLabels(ships);\r
-            ShowCombinedFleet();\r
+            shipInfoPanel.Update();\r
             ShowCurrentFleetNumber();\r
-            UpdateAkashiTimer();\r
-            UpdateFighterPower(IsCombinedFighterPower);\r
-            UpdateLoS();\r
-            UpdateCondTimers();\r
-        }\r
-\r
-        private void ShowCombinedFleet()\r
-        {\r
-            if (!Sniffer.IsCombinedFleet)\r
-                _combinedFleet = false;\r
-            labelFleet1.Text = _combinedFleet ? CombinedName : "第一";\r
-            panelCombinedFleet.Visible = _combinedFleet;\r
-            if (_combinedFleet)\r
-                _mainLabels.SetCombinedShipLabels(Sniffer.Fleets[0].ActualShips, Sniffer.Fleets[1].ActualShips);\r
+            labelFleet1.Text = shipInfoPanel.CombinedFleet ? CombinedName : "第一";\r
         }\r
 \r
         private void ShowCurrentFleetNumber()\r
         {\r
             var labels = new[] {labelCheckFleet1, labelCheckFleet2, labelCheckFleet3, labelCheckFleet4};\r
             for (var i = 0; i < labels.Length; i++)\r
-                labels[i].Visible = _currentFleet == i;\r
+                labels[i].Visible = shipInfoPanel.CurrentFleet == i;\r
         }\r
 \r
-        private bool IsCombinedFighterPower => _combinedFleet &&\r
-                                               (Sniffer.Battle.BattleState == BattleState.None ||\r
-                                                Sniffer.Battle.EnemyIsCombined);\r
-\r
         private string CombinedName\r
         {\r
             get\r
@@ -766,51 +685,11 @@ namespace KancolleSniffer
             _notificationManager.Flash();\r
         }\r
 \r
-        private void UpdateFighterPower(bool combined)\r
-        {\r
-            var fleets = Sniffer.Fleets;\r
-            var fp = combined\r
-                ? fleets[0].FighterPower + fleets[1].FighterPower\r
-                : fleets[_currentFleet].FighterPower;\r
-            labelFighterPower.Text = fp.Min.ToString("D");\r
-            var cr = combined\r
-                ? fleets[0].ContactTriggerRate + fleets[1].ContactTriggerRate\r
-                : fleets[_currentFleet].ContactTriggerRate;\r
-            var text = "制空: " + (fp.Diff ? fp.RangeString : fp.Min.ToString()) +\r
-                       $" 触接: {cr * 100:f1}";\r
-            _toolTip.SetToolTip(labelFighterPower, text);\r
-            _toolTip.SetToolTip(labelFighterPowerCaption, text);\r
-        }\r
-\r
-        private void UpdateLoS()\r
-        {\r
-            var fleet = Sniffer.Fleets[_currentFleet];\r
-            labelLoS.Text = RoundDown(fleet.GetLineOfSights(1)).ToString("F1");\r
-            var text = $"係数2: {RoundDown(fleet.GetLineOfSights(2)):F1}\r\n" +\r
-                       $"係数3: {RoundDown(fleet.GetLineOfSights(3)):F1}\r\n" +\r
-                       $"係数4: {RoundDown(fleet.GetLineOfSights(4)):F1}";\r
-            _toolTip.SetToolTip(labelLoS, text);\r
-            _toolTip.SetToolTip(labelLoSCaption, text);\r
-        }\r
-\r
-        private double RoundDown(double number)\r
-        {\r
-            return Floor(number * 10) / 10.0;\r
-        }\r
-\r
         private void UpdateBattleInfo()\r
         {\r
-            ResetBattleInfo();\r
             _listFormGroup.UpdateBattleResult();\r
             _listFormGroup.UpdateAirBattleResult();\r
-            if (Sniffer.Battle.BattleState == BattleState.None)\r
-                return;\r
-            panelBattleInfo.BringToFront();\r
-            var battle = Sniffer.Battle;\r
-            labelFormation.Text = new[] {"同航戦", "反航戦", "T字有利", "T字不利"}[battle.Formation[2] - 1];\r
-            UpdateBattleFighterPower();\r
-            if ((Config.Spoilers & Spoiler.ResultRank) != 0)\r
-                ShowResultRank();\r
+            shipInfoPanel.UpdateBattleInfo();\r
         }\r
 \r
         private void UpdateCellInfo()\r
@@ -818,74 +697,6 @@ namespace KancolleSniffer
             _listFormGroup.UpdateCellInfo();\r
         }\r
 \r
-        private void ResetBattleInfo()\r
-        {\r
-            labelFormation.Text = "";\r
-            labelEnemyFighterPower.Text = "";\r
-            labelFighterPower.ForeColor = DefaultForeColor;\r
-            labelFighterPowerCaption.Text = "制空";\r
-            labelResultRank.Text = "判定";\r
-            panelBattleInfo.Visible = Sniffer.Battle.BattleState != BattleState.None;\r
-        }\r
-\r
-        private void UpdateBattleFighterPower()\r
-        {\r
-            UpdateEnemyFighterPower();\r
-            var battle = Sniffer.Battle;\r
-            labelFighterPower.ForeColor = AirControlLevelColor(battle);\r
-            labelFighterPowerCaption.Text = AirControlLevelString(battle);\r
-            if (battle.BattleState == BattleState.AirRaid)\r
-            {\r
-                UpdateAirRaidFighterPower();\r
-            }\r
-            else\r
-            {\r
-                UpdateFighterPower(Sniffer.IsCombinedFleet && battle.EnemyIsCombined);\r
-            }\r
-        }\r
-\r
-        private void UpdateEnemyFighterPower()\r
-        {\r
-            var fp = Sniffer.Battle.EnemyFighterPower;\r
-            labelEnemyFighterPower.Text = fp.AirCombat + fp.UnknownMark;\r
-            var toolTip = fp.AirCombat == fp.Interception ? "" : "防空: " + fp.Interception + fp.UnknownMark;\r
-            _toolTip.SetToolTip(labelEnemyFighterPower, toolTip);\r
-            _toolTip.SetToolTip(labelEnemyFighterPowerCaption, toolTip);\r
-        }\r
-\r
-        private void UpdateAirRaidFighterPower()\r
-        {\r
-            var fp = Sniffer.Battle.FighterPower;\r
-            labelFighterPower.Text = fp.Min.ToString();\r
-            var toolTop = fp.Diff ? fp.RangeString : "";\r
-            _toolTip.SetToolTip(labelFighterPower, toolTop);\r
-            _toolTip.SetToolTip(labelFighterPowerCaption, toolTop);\r
-        }\r
-\r
-        private static Color AirControlLevelColor(BattleInfo battle)\r
-        {\r
-            return new[]\r
-                {DefaultForeColor, DefaultForeColor, CUDColors.Blue, CUDColors.Green, CUDColors.Orange, CUDColors.Red}[\r
-                battle.BattleState == BattleState.Night ? 0 : battle.AirControlLevel + 1];\r
-        }\r
-\r
-        private static string AirControlLevelString(BattleInfo battle)\r
-        {\r
-            return new[] {"制空", "拮抗", "確保", "優勢", "劣勢", "喪失"}[\r
-                battle.BattleState == BattleState.Night ? 0 : battle.AirControlLevel + 1];\r
-        }\r
-\r
-        private void ShowResultRank()\r
-        {\r
-            var result = new[] {"完全S", "勝利S", "勝利A", "勝利B", "敗北C", "敗北D", "敗北E"};\r
-            labelResultRank.Text = result[(int)Sniffer.Battle.ResultRank];\r
-        }\r
-\r
-        private void labelResultRank_Click(object sender, EventArgs e)\r
-        {\r
-            ShowResultRank();\r
-        }\r
-\r
         private void UpdateChargeInfo()\r
         {\r
             var fuelSq = new[] {labelFuelSq1, labelFuelSq2, labelFuelSq3, labelFuelSq4};\r
@@ -916,8 +727,6 @@ namespace KancolleSniffer
         {\r
             foreach (var timer in _timers)\r
                 timer.UpdateTimers();\r
-            UpdateCondTimers();\r
-            UpdateAkashiTimer();\r
             _timerEnabled = true;\r
         }\r
 \r
@@ -959,40 +768,6 @@ namespace KancolleSniffer
                 SetPreNotification(key, fleet, subject);\r
         }\r
 \r
-        private void UpdateCondTimers()\r
-        {\r
-            DateTime timer;\r
-            if (_combinedFleet)\r
-            {\r
-                var timer1 = Sniffer.GetConditionTimer(0);\r
-                var timer2 = Sniffer.GetConditionTimer(1);\r
-                timer = timer2 > timer1 ? timer2 : timer1;\r
-            }\r
-            else\r
-            {\r
-                timer = Sniffer.GetConditionTimer(_currentFleet);\r
-            }\r
-            if (timer == DateTime.MinValue)\r
-            {\r
-                labelCondTimerTitle.Text = "";\r
-                labelCondTimer.Text = "";\r
-                return;\r
-            }\r
-            var span = TimeSpan.FromSeconds(Ceiling((timer - _now).TotalSeconds));\r
-            if (span >= TimeSpan.FromMinutes(9) && Config.NotifyConditions.Contains(40))\r
-            {\r
-                labelCondTimerTitle.Text = "cond40まで";\r
-                labelCondTimer.Text = (span - TimeSpan.FromMinutes(9)).ToString(@"mm\:ss");\r
-                labelCondTimer.ForeColor = DefaultForeColor;\r
-            }\r
-            else\r
-            {\r
-                labelCondTimerTitle.Text = "cond49まで";\r
-                labelCondTimer.Text = (span >= TimeSpan.Zero ? span : TimeSpan.Zero).ToString(@"mm\:ss");\r
-                labelCondTimer.ForeColor = span <= TimeSpan.Zero ? CUDColors.Red : DefaultForeColor;\r
-            }\r
-        }\r
-\r
         private void NotifyCondTimers()\r
         {\r
             var notice = Sniffer.GetConditionNotice(_prev, _now);\r
@@ -1013,34 +788,6 @@ namespace KancolleSniffer
             }\r
         }\r
 \r
-        private void UpdateAkashiTimer()\r
-        {\r
-            if (Config.UsePresetAkashi)\r
-                UpdatePresetAkashiTimer();\r
-            _mainLabels.SetAkashiTimer(Sniffer.Fleets[_currentFleet].ActualShips,\r
-                Sniffer.AkashiTimer.GetTimers(_currentFleet, _now));\r
-        }\r
-\r
-        private void UpdatePresetAkashiTimer()\r
-        {\r
-            var akashi = Sniffer.AkashiTimer;\r
-            var span = akashi.GetPresetDeckTimer(_now);\r
-            var color = span == TimeSpan.Zero && akashi.CheckPresetRepairing() ? CUDColors.Red : DefaultForeColor;\r
-            var text = span == TimeSpan.MinValue ? "" : span.ToString(@"mm\:ss");\r
-            labelAkashiRepairTimer.ForeColor = color;\r
-            labelAkashiRepairTimer.Text = text;\r
-            if (akashi.CheckPresetRepairing() && !akashi.CheckRepairing(_currentFleet, _now))\r
-            {\r
-                labelPresetAkashiTimer.ForeColor = color;\r
-                labelPresetAkashiTimer.Text = text;\r
-            }\r
-            else\r
-            {\r
-                labelPresetAkashiTimer.ForeColor = DefaultForeColor;\r
-                labelPresetAkashiTimer.Text = "";\r
-            }\r
-        }\r
-\r
         private void NotifyAkashiTimer()\r
         {\r
             var akashi = Sniffer.AkashiTimer;\r
@@ -1202,10 +949,10 @@ namespace KancolleSniffer
             if (!_started)\r
                 return;\r
             var fleet = (int)((Label)sender).Tag;\r
-            if (_currentFleet == fleet)\r
+            if (shipInfoPanel.CurrentFleet == fleet)\r
                 return;\r
-            _combinedFleet = false;\r
-            _currentFleet = fleet;\r
+            shipInfoPanel.CombinedFleet = false;\r
+            shipInfoPanel.CurrentFleet = fleet;\r
             UpdatePanelShipInfo();\r
         }\r
 \r
@@ -1216,7 +963,7 @@ namespace KancolleSniffer
         {\r
             if (!_started)\r
                 return;\r
-            if (_currentFleet != 0)\r
+            if (shipInfoPanel.CurrentFleet != 0)\r
             {\r
                 labelFleet_Click(sender, e);\r
                 return;\r
@@ -1232,18 +979,18 @@ namespace KancolleSniffer
             {\r
                 _clickSemaphore.Release();\r
             }\r
-            _combinedFleet = Sniffer.IsCombinedFleet && !_combinedFleet;\r
+            shipInfoPanel.CombinedFleet = Sniffer.IsCombinedFleet && !shipInfoPanel.CombinedFleet;\r
             UpdatePanelShipInfo();\r
         }\r
 \r
         private void labelFleet1_MouseHover(object sender, EventArgs e)\r
         {\r
-            labelFleet1.Text = _currentFleet == 0 && Sniffer.IsCombinedFleet && !_combinedFleet ? "連合" : "第一";\r
+            labelFleet1.Text = shipInfoPanel.CurrentFleet == 0 && Sniffer.IsCombinedFleet && !shipInfoPanel.CombinedFleet ? "連合" : "第一";\r
         }\r
 \r
         private void labelFleet1_MouseLeave(object sender, EventArgs e)\r
         {\r
-            labelFleet1.Text = _combinedFleet ? CombinedName : "第一";\r
+            labelFleet1.Text = shipInfoPanel.CombinedFleet ? CombinedName : "第一";\r
         }\r
 \r
         private void labelFleet_DoubleClick(object sender, EventArgs e)\r
@@ -1261,7 +1008,7 @@ namespace KancolleSniffer
                 return;\r
             _doubleClickSemaphore.Release();\r
             var text = TextGenerator.GenerateFleetData(Sniffer, 0);\r
-            if (_combinedFleet)\r
+            if (shipInfoPanel.CombinedFleet)\r
                 text += TextGenerator.GenerateFleetData(Sniffer, 1);\r
             CopyFleetText(text, (Label)sender);\r
         }\r
diff --git a/KancolleSniffer/View/ShipInfoPanel.cs b/KancolleSniffer/View/ShipInfoPanel.cs
new file mode 100644 (file)
index 0000000..8bad2ad
--- /dev/null
@@ -0,0 +1,417 @@
+using System;\r
+using System.Drawing;\r
+using System.Linq;\r
+using System.Windows.Forms;\r
+using KancolleSniffer.Model;\r
+\r
+namespace KancolleSniffer.View\r
+{\r
+    public class ShipInfoPanel : PanelWithToolTip, IUpdateTimers\r
+    {\r
+        private readonly Panel _combinedFleet = new Panel\r
+        {\r
+            Location = new Point(0, 0),\r
+            Size = new Size(220, 113),\r
+            Visible = false\r
+        };\r
+\r
+        private readonly Panel _7Ships = new Panel\r
+        {\r
+            Location = new Point(0, 0),\r
+            Size = new Size(220, 113),\r
+            Visible = false\r
+        };\r
+\r
+        private readonly Panel _battleInfo = new Panel\r
+        {\r
+            Location = new Point(59, 116),\r
+            Size = new Size(157, 14),\r
+            Visible = false\r
+        };\r
+\r
+        private readonly Label _presetAkashiTimer = new Label\r
+        {\r
+            Location = new Point(2, 3),\r
+            Size = new Size(32, 12),\r
+            BackColor = CustomColors.ColumnColors.Bright\r
+        };\r
+\r
+        public LinkLabel Guide { get; } = new LinkLabel\r
+        {\r
+            AutoSize = true,\r
+            Font = new Font("MS UI Gothic", 9.75F, FontStyle.Regular, GraphicsUnit.Point, 128),\r
+            LinkArea = new LinkArea(0, 0),\r
+            Location = new Point(31, 51),\r
+            Text = "右クリックでメニューが出ます。"\r
+        };\r
+\r
+        private readonly Label _enemyFighterPower = new Label\r
+        {\r
+            Location = new Point(129, 1),\r
+            Size = new Size(29, 12),\r
+            TextAlign = ContentAlignment.MiddleRight\r
+        };\r
+\r
+        private readonly Label _enemyFighterPowerCaption = new Label\r
+        {\r
+            AutoSize = true,\r
+            Location = new Point(90, 1),\r
+            Text = "敵制空"\r
+        };\r
+\r
+        private readonly Label _formation = new Label\r
+        {\r
+            Location = new Point(40, 1),\r
+            Size = new Size(48, 12)\r
+        };\r
+\r
+        private readonly Label _resultRank = new Label\r
+        {\r
+            Location = new Point(1, 1),\r
+            Size = new Size(42, 12),\r
+            TabIndex = 0,\r
+            Text = "判定"\r
+        };\r
+\r
+        private readonly Label _lineOfSight = new Label\r
+        {\r
+            Location = new Point(85, 117),\r
+            Size = new Size(38, 12),\r
+            Text = "0.0",\r
+            TextAlign = ContentAlignment.MiddleRight\r
+        };\r
+\r
+        private readonly Label _lineOfSightCaption = new Label\r
+        {\r
+            AutoSize = true,\r
+            Location = new Point(59, 117),\r
+            Text = "索敵"\r
+        };\r
+\r
+        private readonly Label _fighterPower = new Label\r
+        {\r
+            Location = new Point(28, 117),\r
+            Size = new Size(29, 12),\r
+            Text = "0",\r
+            TextAlign = ContentAlignment.MiddleRight\r
+        };\r
+\r
+        private readonly Label _fighterPowerCaption = new Label\r
+        {\r
+            AutoSize = true,\r
+            Location = new Point(2, 117),\r
+            Text = "制空"\r
+        };\r
+\r
+        private readonly Label _condTimerCaption = new Label\r
+        {\r
+            Location = new Point(128, 117),\r
+            Size = new Size(60, 12)\r
+        };\r
+\r
+        private readonly Label _condTimer = new Label\r
+        {\r
+            AutoSize = true,\r
+            Location = new Point(186, 117)\r
+        };\r
+\r
+        private readonly MainShipLabels _mainLabels = new MainShipLabels();\r
+\r
+        public UpdateContext Context { get; set; }\r
+\r
+        public int CurrentFleet { get; set; }\r
+\r
+        public bool CombinedFleet { get; set; }\r
+\r
+        public Action<int> ShowShipOnList { get; set; }\r
+\r
+        public ShipInfoPanel()\r
+        {\r
+            Controls.AddRange(new Control[] {Guide, _presetAkashiTimer, _combinedFleet, _7Ships});\r
+            BorderStyle = BorderStyle.FixedSingle;\r
+            _mainLabels.CreateAllShipLabels(new MainShipPanels\r
+            {\r
+                PanelShipInfo = this,\r
+                Panel7Ships = _7Ships,\r
+                PanelCombinedFleet = _combinedFleet\r
+            }, ShipClickHandler);\r
+            _battleInfo.Controls.AddRange(new Control[]\r
+            {\r
+                _enemyFighterPower, _enemyFighterPowerCaption, _formation, _resultRank\r
+            });\r
+            Controls.AddRange(new Control[]\r
+            {\r
+                _battleInfo,\r
+                _lineOfSight, _lineOfSightCaption, _fighterPower, _fighterPowerCaption, _condTimer, _condTimerCaption\r
+            });\r
+            _resultRank.Click += ResultRankClick;\r
+            Size = new Size(220, 134);\r
+        }\r
+\r
+        private void ShipClickHandler(object sender, EventArgs e)\r
+        {\r
+            var idx = (int)((Control)sender).Tag;\r
+            var ship = (CombinedFleet\r
+                ? Context.Sniffer.Fleets[0].Ships.Concat(Context.Sniffer.Fleets[1].Ships)\r
+                : Context.Sniffer.Fleets[CurrentFleet].Ships).ElementAt(idx);\r
+            if (!ship.Empty)\r
+                ShowShipOnList(ship.Id);\r
+        }\r
+\r
+        public void ToggleHpPercent()\r
+        {\r
+            _mainLabels.ToggleHpPercent();\r
+        }\r
+\r
+        public bool ShowHpInPercent => _mainLabels.ShowHpInPercent;\r
+\r
+        private bool _inSortie;\r
+\r
+        public void SetCurrentFleet()\r
+        {\r
+            var inSortie = Context.Sniffer.InSortie;\r
+            if (_inSortie || inSortie == -1)\r
+            {\r
+                _inSortie = inSortie != -1;\r
+                return;\r
+            }\r
+            _inSortie = true;\r
+            if (inSortie == 10)\r
+            {\r
+                CombinedFleet = true;\r
+                CurrentFleet = 0;\r
+            }\r
+            else\r
+            {\r
+                CombinedFleet = false;\r
+                CurrentFleet = inSortie;\r
+            }\r
+            SetCombined();\r
+        }\r
+\r
+        private bool _prevCombined;\r
+\r
+        private void SetCombined()\r
+        {\r
+            if (Context.Sniffer.IsCombinedFleet && !_prevCombined)\r
+            {\r
+                CombinedFleet = true;\r
+                CurrentFleet = 0;\r
+            }\r
+            _prevCombined = Context.Sniffer.IsCombinedFleet;\r
+        }\r
+\r
+        public new void Update()\r
+        {\r
+            var ships = Context.Sniffer.Fleets[CurrentFleet].ActualShips;\r
+            _7Ships.Visible = ships.Count == 7;\r
+            _mainLabels.SetShipLabels(ships);\r
+            ShowCombinedFleet();\r
+            _presetAkashiTimer.Visible = Context.Config.UsePresetAkashi;\r
+            UpdateAkashiTimer();\r
+            UpdateFighterPower(IsCombinedFighterPower);\r
+            UpdateLoS();\r
+            UpdateCondTimers();\r
+        }\r
+\r
+        private void ShowCombinedFleet()\r
+        {\r
+            if (!Context.Sniffer.IsCombinedFleet)\r
+                CombinedFleet = false;\r
+            _combinedFleet.Visible = CombinedFleet;\r
+            if (CombinedFleet)\r
+            {\r
+                _mainLabels.SetCombinedShipLabels(Context.Sniffer.Fleets[0].ActualShips,\r
+                    Context.Sniffer.Fleets[1].ActualShips);\r
+            }\r
+        }\r
+\r
+        private bool IsCombinedFighterPower => CombinedFleet &&\r
+                                               (Context.Sniffer.Battle.BattleState == BattleState.None ||\r
+                                                Context.Sniffer.Battle.EnemyIsCombined);\r
+\r
+        private void UpdateFighterPower(bool combined)\r
+        {\r
+            var fleets = Context.Sniffer.Fleets;\r
+            var fp = combined\r
+                ? fleets[0].FighterPower + fleets[1].FighterPower\r
+                : fleets[CurrentFleet].FighterPower;\r
+            _fighterPower.Text = fp.Min.ToString("D");\r
+            var cr = combined\r
+                ? fleets[0].ContactTriggerRate + fleets[1].ContactTriggerRate\r
+                : fleets[CurrentFleet].ContactTriggerRate;\r
+            var text = "制空: " + (fp.Diff ? fp.RangeString : fp.Min.ToString()) +\r
+                       $" 触接: {cr * 100:f1}";\r
+            ToolTip.SetToolTip(_fighterPower, text);\r
+            ToolTip.SetToolTip(_fighterPowerCaption, text);\r
+        }\r
+\r
+        private void UpdateLoS()\r
+        {\r
+            var fleet = Context.Sniffer.Fleets[CurrentFleet];\r
+            _lineOfSight.Text = RoundDown(fleet.GetLineOfSights(1)).ToString("F1");\r
+            var text = $"係数2: {RoundDown(fleet.GetLineOfSights(2)):F1}\r\n" +\r
+                       $"係数3: {RoundDown(fleet.GetLineOfSights(3)):F1}\r\n" +\r
+                       $"係数4: {RoundDown(fleet.GetLineOfSights(4)):F1}";\r
+            ToolTip.SetToolTip(_lineOfSight, text);\r
+            ToolTip.SetToolTip(_lineOfSightCaption, text);\r
+        }\r
+\r
+        private double RoundDown(double number)\r
+        {\r
+            return Math.Floor(number * 10) / 10.0;\r
+        }\r
+\r
+        public void UpdateBattleInfo()\r
+        {\r
+            ResetBattleInfo();\r
+            if (Context.Sniffer.Battle.BattleState == BattleState.None)\r
+                return;\r
+            _battleInfo.BringToFront();\r
+            var battle = Context.Sniffer.Battle;\r
+            _formation.Text = new[] {"同航戦", "反航戦", "T字有利", "T字不利"}[battle.Formation[2] - 1];\r
+            UpdateBattleFighterPower();\r
+            if ((Context.Config.Spoilers & Spoiler.ResultRank) != 0)\r
+                ShowResultRank();\r
+        }\r
+\r
+        private void ResetBattleInfo()\r
+        {\r
+            _formation.Text = "";\r
+            _enemyFighterPower.Text = "";\r
+            _fighterPower.ForeColor = DefaultForeColor;\r
+            _fighterPowerCaption.Text = "制空";\r
+            _resultRank.Text = "判定";\r
+            _battleInfo.Visible = Context.Sniffer.Battle.BattleState != BattleState.None;\r
+        }\r
+\r
+        private void UpdateBattleFighterPower()\r
+        {\r
+            UpdateEnemyFighterPower();\r
+            var battle = Context.Sniffer.Battle;\r
+            _fighterPower.ForeColor = AirControlLevelColor(battle);\r
+            _fighterPowerCaption.Text = AirControlLevelString(battle);\r
+            if (battle.BattleState == BattleState.AirRaid)\r
+            {\r
+                UpdateAirRaidFighterPower();\r
+            }\r
+            else\r
+            {\r
+                UpdateFighterPower(Context.Sniffer.IsCombinedFleet && battle.EnemyIsCombined);\r
+            }\r
+        }\r
+\r
+        private void UpdateEnemyFighterPower()\r
+        {\r
+            var fp = Context.Sniffer.Battle.EnemyFighterPower;\r
+            _enemyFighterPower.Text = fp.AirCombat + fp.UnknownMark;\r
+            var toolTip = fp.AirCombat == fp.Interception ? "" : "防空: " + fp.Interception + fp.UnknownMark;\r
+            ToolTip.SetToolTip(_enemyFighterPower, toolTip);\r
+            ToolTip.SetToolTip(_enemyFighterPowerCaption, toolTip);\r
+        }\r
+\r
+        private void UpdateAirRaidFighterPower()\r
+        {\r
+            var fp = Context.Sniffer.Battle.FighterPower;\r
+            _fighterPower.Text = fp.Min.ToString();\r
+            var toolTop = fp.Diff ? fp.RangeString : "";\r
+            ToolTip.SetToolTip(_fighterPower, toolTop);\r
+            ToolTip.SetToolTip(_fighterPowerCaption, toolTop);\r
+        }\r
+\r
+        private static Color AirControlLevelColor(BattleInfo battle)\r
+        {\r
+            return new[]\r
+                {DefaultForeColor, DefaultForeColor, CUDColors.Blue, CUDColors.Green, CUDColors.Orange, CUDColors.Red}[\r
+                battle.BattleState == BattleState.Night ? 0 : battle.AirControlLevel + 1];\r
+        }\r
+\r
+        private static string AirControlLevelString(BattleInfo battle)\r
+        {\r
+            return new[] {"制空", "拮抗", "確保", "優勢", "劣勢", "喪失"}[\r
+                battle.BattleState == BattleState.Night ? 0 : battle.AirControlLevel + 1];\r
+        }\r
+\r
+        private void ShowResultRank()\r
+        {\r
+            var result = new[] {"完全S", "勝利S", "勝利A", "勝利B", "敗北C", "敗北D", "敗北E"};\r
+            _resultRank.Text = result[(int)Context.Sniffer.Battle.ResultRank];\r
+        }\r
+\r
+        private void ResultRankClick(object sender, EventArgs e)\r
+        {\r
+            ShowResultRank();\r
+        }\r
+\r
+        private void UpdateCondTimers()\r
+        {\r
+            DateTime timer;\r
+            if (CombinedFleet)\r
+            {\r
+                var timer1 = Context.Sniffer.GetConditionTimer(0);\r
+                var timer2 = Context.Sniffer.GetConditionTimer(1);\r
+                timer = timer2 > timer1 ? timer2 : timer1;\r
+            }\r
+            else\r
+            {\r
+                timer = Context.Sniffer.GetConditionTimer(CurrentFleet);\r
+            }\r
+            if (timer == DateTime.MinValue)\r
+            {\r
+                _condTimerCaption.Text = "";\r
+                _condTimer.Text = "";\r
+                return;\r
+            }\r
+            var span = TimeSpan.FromSeconds(Math.Ceiling((timer - Context.GetNow()).TotalSeconds));\r
+            if (span >= TimeSpan.FromMinutes(9) && Context.Config.NotifyConditions.Contains(40))\r
+            {\r
+                _condTimerCaption.Text = "cond40まで";\r
+                _condTimer.Text = (span - TimeSpan.FromMinutes(9)).ToString(@"mm\:ss");\r
+                _condTimer.ForeColor = DefaultForeColor;\r
+            }\r
+            else\r
+            {\r
+                _condTimerCaption.Text = "cond49まで";\r
+                _condTimer.Text = (span >= TimeSpan.Zero ? span : TimeSpan.Zero).ToString(@"mm\:ss");\r
+                _condTimer.ForeColor = span <= TimeSpan.Zero ? CUDColors.Red : DefaultForeColor;\r
+            }\r
+        }\r
+\r
+        public Label AkashiRepairTimer { get; set; }\r
+\r
+        public void UpdateTimers()\r
+        {\r
+            UpdateAkashiTimer();\r
+            UpdatePresetAkashiTimer();\r
+        }\r
+\r
+        private void UpdateAkashiTimer()\r
+        {\r
+            if (Context.Config.UsePresetAkashi)\r
+                UpdatePresetAkashiTimer();\r
+            _mainLabels.SetAkashiTimer(Context.Sniffer.Fleets[CurrentFleet].ActualShips,\r
+                Context.Sniffer.AkashiTimer.GetTimers(CurrentFleet, Context.GetNow()));\r
+        }\r
+\r
+        private void UpdatePresetAkashiTimer()\r
+        {\r
+            var now = Context.GetNow();\r
+            var akashi = Context.Sniffer.AkashiTimer;\r
+            var span = akashi.GetPresetDeckTimer(now);\r
+            var color = span == TimeSpan.Zero && akashi.CheckPresetRepairing() ? CUDColors.Red : DefaultForeColor;\r
+            var text = span == TimeSpan.MinValue ? "" : span.ToString(@"mm\:ss");\r
+            AkashiRepairTimer.ForeColor = color;\r
+            AkashiRepairTimer.Text = text;\r
+            if (akashi.CheckPresetRepairing() && !akashi.CheckRepairing(CurrentFleet, now))\r
+            {\r
+                _presetAkashiTimer.ForeColor = color;\r
+                _presetAkashiTimer.Text = text;\r
+            }\r
+            else\r
+            {\r
+                _presetAkashiTimer.ForeColor = DefaultForeColor;\r
+                _presetAkashiTimer.Text = "";\r
+            }\r
+        }\r
+    }\r
+}
\ No newline at end of file