<HintPath>..\packages\Moq.4.2.1506.2515\lib\net40\Moq.dll</HintPath>\r
</Reference>\r
<Reference Include="System" />\r
+ <Reference Include="System.Windows.Forms" />\r
</ItemGroup>\r
<Choose>\r
<When Condition="('$(VisualStudioVersion)' == '10.0' or '$(VisualStudioVersion)' == '') and '$(TargetFrameworkVersion)' == 'v3.5'">\r
</Choose>\r
<ItemGroup>\r
<Compile Include="JsonTest.cs" />\r
+ <Compile Include="ShipLabelTest.cs" />\r
<Compile Include="SnifferTest.cs" />\r
<Compile Include="Properties\AssemblyInfo.cs" />\r
<Compile Include="LoggerTest.cs" />\r
--- /dev/null
+<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
+ <s:String x:Key="/Default/CodeEditing/Localization/Localizable/@EntryValue">No</s:String></wpf:ResourceDictionary>
\ No newline at end of file
--- /dev/null
+// Copyright (C) 2016 Kazuhiro Fujieda <fujieda@users.osdn.me>\r
+//\r
+// Licensed under the Apache License, Version 2.0 (the "License");\r
+// you may not use this file except in compliance with the License.\r
+// You may obtain a copy of the License at\r
+//\r
+// http://www.apache.org/licenses/LICENSE-2.0\r
+//\r
+// Unless required by applicable law or agreed to in writing, software\r
+// distributed under the License is distributed on an "AS IS" BASIS,\r
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+// See the License for the specific language governing permissions and\r
+// limitations under the License.\r
+\r
+using System.Collections.Generic;\r
+using System.Windows.Forms;\r
+using ExpressionToCodeLib;\r
+using Microsoft.VisualStudio.TestTools.UnitTesting;\r
+\r
+namespace KancolleSniffer.Test\r
+{\r
+ [TestClass]\r
+ public class ShipLabelTest\r
+ {\r
+ /// <summary>\r
+ /// 明石タイマー表示中の艦娘の名前を縮める\r
+ /// </summary>\r
+ [TestMethod]\r
+ public void TrancateNameForAkashiTimer()\r
+ {\r
+ var dict = new Dictionary<string, string>\r
+ {\r
+ {"夕立改二", "夕立改二"},\r
+ {"千代田航改", "千代田航"},\r
+ {"千代田航改二", "千代田航"},\r
+ {"Bismarck改", "Bismarck"},\r
+ {"Bismarck twei", "Bismarck"},\r
+ {"Bismarck drei", "Bismarck"},\r
+ {"Prinz Eugen", "Prinz Eug"},\r
+ {"Prinz Eugen改", "Prinz Eug"},\r
+ {"Graf Zeppelin", "Graf Zep"},\r
+ {"Graf Zeppelin改", "Graf Zep"},\r
+ {"Libeccio改", "Libeccio"},\r
+ };\r
+ var label = new ShipLabel {Parent = new Panel()};\r
+ foreach (var entry in dict)\r
+ {\r
+ label.SetName("", entry.Key, "", ShipNameWidth.AkashiTimer);\r
+ PAssert.That(() => label.Text == entry.Value, entry.Key);\r
+ }\r
+ }\r
+\r
+ /// <summary>\r
+ /// 入渠中の艦娘名の名前を縮める\r
+ /// </summary>\r
+ [TestMethod]\r
+ public void TrancateNameForNDock()\r
+ {\r
+ var dict = new Dictionary<string, string>\r
+ {\r
+ {"千歳航改二", "千歳航改二"},\r
+ {"Graf Zeppelin", "Graf Zeppeli"},\r
+ {"Graf Zeppelin改", "Graf Zeppeli"},\r
+ {"千代田航改二", "千代田航改"}\r
+ };\r
+ var label = new ShipLabel {Parent = new Panel()};\r
+ foreach (var entry in dict)\r
+ {\r
+ label.SetName("", entry.Key, "", ShipNameWidth.NDock);\r
+ PAssert.That(() => label.Text == entry.Value, entry.Key);\r
+ }\r
+ }\r
+\r
+ /// <summary>\r
+ /// 一覧ウィンドウの要修復一覧の艦娘の名前を縮める\r
+ /// </summary>\r
+ [TestMethod]\r
+ public void TrancateNameForRepairList()\r
+ {\r
+ var dict = new Dictionary<string, string>\r
+ {\r
+ {"Graf Zeppelin", "Graf Zeppelin"},\r
+ {"Graf Zeppelin改", "Graf Zeppelin"},\r
+ {"千代田航改二", "千代田航改"}\r
+ };\r
+ var label = new ShipLabel {Parent = new Panel()};\r
+ foreach (var entry in dict)\r
+ {\r
+ label.SetName("", entry.Key, "", ShipNameWidth.RepairListFull);\r
+ PAssert.That(() => label.Text == entry.Value, entry.Key);\r
+ }\r
+ }\r
+\r
+ /// <summary>\r
+ /// prefixとsuffixを加える\r
+ /// </summary>\r
+ [TestMethod]\r
+ public void SetName()\r
+ {\r
+ var label = new ShipLabel {Parent= new Panel()};\r
+ label.SetName("[避]", "綾波改二", "▫");\r
+ PAssert.That(() => label.Text == "[避]綾波改二▫");\r
+ label.SetName("[避]", "朝潮改二丁", "▫", ShipNameWidth.AkashiTimer);\r
+ PAssert.That(() => label.Text == "[避]朝潮改二▫");\r
+ }\r
+ }\r
+}
\ No newline at end of file
rpl[1].SetLevel(s);\r
rpl[2].SetRepairTime(s);\r
rpl[3].Text = TimeSpan.FromSeconds(s.RepairSecPerHp).ToString(@"mm\:ss");\r
- rpl[4].SetName(s, new Dictionary<string, string> {{"Graf Zeppelin改", "Graf Zeppelin"}, {"千代田航改二", "千代田航改"}});\r
+ rpl[4].SetName(s, ShipNameWidth.RepairListFull);\r
rpl[5].SetFleet(s);\r
rpp.Visible = true;\r
}\r
// limitations under the License.\r
\r
using System;\r
-using System.Collections.Generic;\r
using System.Drawing;\r
using System.Linq;\r
using System.Text.RegularExpressions;\r
\r
namespace KancolleSniffer\r
{\r
+ public enum ShipNameWidth\r
+ {\r
+ AkashiTimer = 53,\r
+ NDock = 69,\r
+ RepairList = NDock,\r
+ RepairListFull = 75,\r
+ Max = int.MaxValue\r
+ }\r
+\r
public class ShipLabels\r
{\r
private readonly ShipLabel[][] _labels = new ShipLabel[ShipInfo.MemberCount][];\r
label.Visible = true;\r
label.Text = timer.Span.ToString(@"mm\:ss");\r
label.ForeColor = Control.DefaultForeColor;\r
- labelName.SetName(stat, _shortNameDict);\r
+ labelName.SetName(stat, ShipNameWidth.AkashiTimer);\r
if (timer.Diff == 0)\r
{\r
labelHp.ForeColor = Control.DefaultForeColor;\r
}\r
}\r
\r
- private readonly Dictionary<string, string> _shortNameDict = new Dictionary<string, string>\r
- {\r
- {"千代田航改", "千代田航"},\r
- {"千代田航改二", "千代田航"},\r
- {"千歳航改二", "千歳航改"},\r
- {"五十鈴改二", "五十鈴改"},\r
- {"あきつ丸改", "あきつ丸"},\r
- {"Bismarck改", "Bismarck"},\r
- {"Bismarck twei", "Bismarck"},\r
- {"Bismarck drei", "Bismarck"},\r
- {"Prinz Eugen", "Prinz Eug"},\r
- {"Prinz Eugen改", "Prinz Eug"},\r
- {"Graf Zeppelin", "Graf Zep"},\r
- {"Graf Zeppelin改", "Graf Zep"},\r
- {"Libeccio改", "Libeccio"},\r
- {"阿武隈改二", "阿武隈改"},\r
- {"瑞鶴改二甲", "瑞鶴改二"},\r
- {"翔鶴改二甲", "翔鶴改二"},\r
- {"朝潮改二丁", "朝潮改二"}\r
- };\r
-\r
public void CreateRepairList(Control parent, EventHandler onClick)\r
{\r
parent.SuspendLayout();\r
var s = list[i];\r
var labels = _repairList[i];\r
labels[fleet].SetFleet(s);\r
- labels[name].SetName(s, new Dictionary<string, string>\r
- {\r
- {"Graf Zeppelin", "Graf Zeppeli"},\r
- {"Graf Zeppelin改", "Graf Zeppeli"},\r
- {"千代田航改二", "千代田航改"}\r
- });\r
+ labels[name].SetName(s, ShipNameWidth.RepairList);\r
labels[time].SetRepairTime(s);\r
labels[damage].BackColor = ShipLabel.DamageColor(s, labels[damage].PresetColor);\r
}\r
\r
public void SetNDockLabels(NameAndTimer[] ndock)\r
{\r
- var dict = new Dictionary<string, string>\r
- {\r
- {"Graf Zeppelin", "Graf Zeppeli"},\r
- {"Graf Zeppelin改", "Graf Zeppeli"},\r
- {"千代田航改二", "千代田航改"}\r
- };\r
for (var i = 0; i < _ndockLabels.Length; i++)\r
- {\r
- string name;\r
- _ndockLabels[i][1].SetName(dict.TryGetValue(ndock[i].Name, out name) ? name : ndock[i].Name);\r
- }\r
+ _ndockLabels[i][1].SetName("", ndock[i].Name, "", ShipNameWidth.NDock);\r
}\r
\r
public void SetNDockTimer(int dock, RingTimer timer, bool finishTime)\r
UseMnemonic = false;\r
}\r
\r
- public void SetName(ShipStatus status, Dictionary<string, string> convDict = null)\r
+ public void SetName(ShipStatus status, ShipNameWidth width = ShipNameWidth.Max)\r
{\r
- string name;\r
- if (convDict == null || !convDict.TryGetValue(status.Name, out name))\r
- name = status.Name;\r
var empty = status.Id != -1 && status.Slot.All(e => e.Id == -1) ? "▫" : "";\r
var dc = status.PreparedDamageControl;\r
var dcname = dc == 42 ? "[ダ]" : dc == 43 ? "[メ]" : "";\r
- SetName((status.Escaped ? "[避]" : dcname) + name + empty);\r
+ SetName((status.Escaped ? "[避]" : dcname), status.Name, empty, width);\r
}\r
\r
public void SetName(string name)\r
{\r
- var lu = name != null && new Regex(@"^(?:\[.\])?\p{Lu}").IsMatch(name);\r
+ SetName("", name, "");\r
+ }\r
+\r
+ public void SetName(string prefix, string name, string suffix, ShipNameWidth width = ShipNameWidth.Max)\r
+ {\r
+ if (name == null)\r
+ return;\r
+ var lu = new Regex(@"^\p{Lu}").IsMatch(name);\r
var shift = (int)Round(ScaleFactor.Height);\r
if (lu && Font.Equals(Parent.Font))\r
{\r
Location += new Size(0, shift);\r
Font = Parent.Font;\r
}\r
- Text = name;\r
+ var result = prefix + name + suffix;\r
+ var measured = TextRenderer.MeasureText(result, Font).Width;\r
+ if (measured <= (int)width)\r
+ {\r
+ Text = result;\r
+ return;\r
+ }\r
+ var truncated = "";\r
+ foreach (var ch in name)\r
+ {\r
+ var tmp = truncated + ch;\r
+ if (TextRenderer.MeasureText(tmp, Font).Width > (int)width)\r
+ break;\r
+ truncated = tmp;\r
+ }\r
+ Text = prefix + truncated.TrimEnd(' ') + suffix;\r
}\r
\r
public void SetHp(ShipStatus status)\r