// limitations under the License.\r
\r
using System;\r
+using System.Collections;\r
+using System.Collections.Generic;\r
using System.Drawing;\r
using System.Linq;\r
using System.Windows.Forms;\r
private const int PanelPadding = 5;\r
private const int LabelPadding = 2;\r
private const int LineHeight = 16;\r
- private readonly ShipLabel[][] _repairLabels = new ShipLabel[14][];\r
+ private readonly RepairListLabels[] _repairLabels = new RepairListLabels[14];\r
private ShipStatus[] _repairList = new ShipStatus[0];\r
private int _repairListPosition;\r
\r
+ private class RepairListLabels : IEnumerable<ShipLabel>\r
+ {\r
+ public ShipLabel Fleet { get; set; }\r
+ public ShipLabel Name { get; set; }\r
+ public ShipLabel Time { get; set; }\r
+ public ShipLabel Damage { get; set; }\r
+ public ShipLabel BackGround { private get; set; }\r
+\r
+ public IEnumerator<ShipLabel> GetEnumerator()\r
+ {\r
+ foreach (var label in new[] {Fleet, Damage, Time, Name, BackGround})\r
+ yield return label;\r
+ }\r
+\r
+ IEnumerator IEnumerable.GetEnumerator()\r
+ {\r
+ return GetEnumerator();\r
+ }\r
+ }\r
+\r
public void CreateLabels(EventHandler onClick)\r
{\r
SuspendLayout();\r
{\r
var y = PanelPadding + LabelPadding + i * LineHeight;\r
const int height = 12;\r
- Controls.AddRange(_repairLabels[i] = new[]\r
+ _repairLabels[i] = new RepairListLabels\r
{\r
- new ShipLabel {Location = new Point(0, y), Size = new Size(11, height)},\r
- new ShipLabel {Location = new Point(119, y), Size = new Size(5, height - 1)},\r
- new ShipLabel {Location = new Point(75, y), AutoSize = true},\r
- new ShipLabel {Location = new Point(9, y), AutoSize = true},\r
- new ShipLabel {Location = new Point(0, y - LabelPadding), Size = new Size(Width, height + LabelPadding + 1)}\r
- });\r
+ Fleet = new ShipLabel {Location = new Point(0, y), Size = new Size(11, height)},\r
+ Damage = new ShipLabel {Location = new Point(119, y), Size = new Size(5, height - 1)},\r
+ Time = new ShipLabel {Location = new Point(75, y), AutoSize = true},\r
+ Name = new ShipLabel {Location = new Point(9, y), AutoSize = true},\r
+ BackGround = new ShipLabel\r
+ {\r
+ Location = new Point(0, y - LabelPadding),\r
+ Size = new Size(Width, height + LabelPadding + 1)\r
+ }\r
+ };\r
+ Controls.AddRange(_repairLabels[i].Cast<Control>().ToArray());\r
foreach (var label in _repairLabels[i])\r
{\r
label.Scale();\r
label.Click += onClick;\r
}\r
}\r
- foreach (var label in _repairLabels[0])\r
+ SetScrollEventHandler();\r
+ ResumeLayout();\r
+ }\r
+\r
+ private void SetScrollEventHandler()\r
+ {\r
+ foreach (var label in _repairLabels.First())\r
{\r
label.MouseEnter += TopRepairLabelsOnMouseEnter;\r
label.MouseLeave += TopRepairLabelsOnMouseLeave;\r
}\r
- _topScrollRepeatTimer.Tick += TopRepairLabelsOnMouseEnter;\r
foreach (var label in _repairLabels.Last())\r
{\r
label.MouseEnter += BottomRepairLabelsOnMouseEnter;\r
label.MouseLeave += BottomRepairLabelsOnMouseLeave;\r
}\r
+ _topScrollRepeatTimer.Tick += TopRepairLabelsOnMouseEnter;\r
_bottomScrollRepeatTimer.Tick += BottomRepairLabelsOnMouseEnter;\r
- ResumeLayout();\r
}\r
\r
private readonly Timer _topScrollRepeatTimer = new Timer {Interval = 100};\r
\r
public void SetRepairList(ShipStatus[] list)\r
{\r
- const int fleet = 0, name = 3, time = 2, damage = 1;\r
_repairList = list;\r
+ SetPanelHeight();\r
if (list.Length == 0)\r
{\r
- Size = new Size(Width, (int)Round(ShipLabel.ScaleFactor.Height * (LineHeight + PanelPadding * 2)));\r
- var labels = _repairLabels[0];\r
- labels[fleet].Text = "";\r
- labels[name].SetName("なし");\r
- labels[time].Text = "";\r
- labels[damage].BackColor = labels[damage].PresetColor;\r
+ SetPanelHeight();\r
+ ClearLabels(0);\r
+ _repairLabels[0].Name.SetName("なし");\r
return;\r
}\r
- Size = new Size(Width,\r
- (int)Round(ShipLabel.ScaleFactor.Height *\r
- (Min(_repairList.Length, _repairLabels.Length) * LineHeight + PanelPadding * 2)));\r
_repairListPosition = Min(_repairListPosition, Max(0, _repairList.Length - _repairLabels.Length));\r
ShowRepairList();\r
}\r
\r
+ private void SetPanelHeight()\r
+ {\r
+ var lines = Min(Max(1, _repairList.Length), _repairLabels.Length);\r
+ Size = new Size(Width, (int)Round(ShipLabel.ScaleFactor.Height * lines * LineHeight + PanelPadding * 2));\r
+ }\r
+\r
public void ShowRepairList()\r
{\r
- const int fleet = 0, name = 3, time = 2, damage = 1;\r
for (var i = 0; i < Min(_repairList.Length, _repairLabels.Length); i++)\r
{\r
var s = _repairList[i + _repairListPosition];\r
var labels = _repairLabels[i];\r
- labels[fleet].SetFleet(s);\r
- labels[name].SetName(s, ShipNameWidth.RepairList);\r
- labels[time].SetRepairTime(s);\r
- labels[damage].BackColor = ShipLabel.DamageColor(s, labels[damage].PresetColor);\r
+ labels.Fleet.SetFleet(s);\r
+ labels.Name.SetName(s, ShipNameWidth.RepairList);\r
+ labels.Time.SetRepairTime(s);\r
+ labels.Damage.BackColor = ShipLabel.DamageColor(s, labels.Damage.PresetColor);\r
}\r
DrawMark();\r
}\r
\r
+ public void ClearLabels(int i)\r
+ {\r
+ var labels = _repairLabels[i];\r
+ labels.Fleet.Text = "";\r
+ labels.Name.SetName("");\r
+ labels.Time.Text = "";\r
+ labels.Damage.BackColor = labels.Damage.PresetColor;\r
+ }\r
+\r
private void DrawMark()\r
{\r
using (var g = CreateGraphics())\r
new PointF(Width * 0.45f, Height - PanelPadding - 2), new PointF(Width * 0.55f, Height - PanelPadding - 2),\r
new PointF(Width * 0.5f, Height - 2), new PointF(Width * 0.45f, Height - PanelPadding - 2)\r
});\r
-\r
}\r
}\r
\r