コード例 #1
0
        private void CalculateRowsAndColumns()
        {
            var columnSizes = ColumnSizes?.Split(';') ?? new string[] { };
            var rowSizes    = RowSizes?.Split(';') ?? new string[] { };


            var columnIndex = 0;
            var rowIndex    = 0;

            var totalRowCount    = 0;
            var totalColumnCount = 0;

            foreach (var c in this.Children.OfType <FrameworkElement>())
            {
                var customColumnIndex    = GetColumn(c);
                var customRowIndex       = GetRow(c);
                var effectiveColumnIndex = customColumnIndex == 0 ? columnIndex : customColumnIndex;
                var effectiveRowIndex    = customRowIndex == 0 ? rowIndex : customRowIndex;


                SetColumn(c, effectiveColumnIndex);
                SetRow(c, effectiveRowIndex);


                totalColumnCount = Math.Max(totalColumnCount, columnIndex + 1);
                totalRowCount    = Math.Max(totalRowCount, rowIndex + 1);

                if (HorizontalLayout)
                {
                    var span = GetColumnSpan(c);
                    columnIndex = columnIndex + Math.Max(1, span);
                    if (columnIndex < columnSizes.Length)
                    {
                        continue;
                    }

                    if (!HorizontalAutoFill || rowIndex < rowSizes.Length)
                    {
                        columnIndex = 0;
                        ++rowIndex;
                    }
                }
                else
                {
                    var span = GetRowSpan(c);
                    rowIndex = rowIndex + Math.Max(1, span);
                    if (rowIndex < rowSizes.Length)
                    {
                        continue;
                    }

                    if (HorizontalAutoFill || columnIndex < columnSizes.Length)
                    {
                        rowIndex = 0;
                        ++columnIndex;
                    }
                }
            }

            var minColumnCount = totalColumnCount;
            var minRowCount    = totalRowCount;

            var indexToCountOffset = (DefaultGridLength?.IsAuto).GetValueOrDefault() ? 1 : 0;

            if (HorizontalAutoFill)
            {
                minColumnCount += indexToCountOffset;
            }
            else
            {
                minRowCount += indexToCountOffset;
            }

            for (var i = this.ColumnDefinitions.Count; i < minColumnCount; i++)
            {
                var gridLength = this.CreateGridLength(columnSizes.ElementAtOrDefault(i),
                                                       HorizontalAutoFill ? default(GridUnitType?) : GridUnitType.Star);
                this.ColumnDefinitions.Add(new ColumnDefinition
                {
                    Width = gridLength
                });
            }

            for (var i = this.RowDefinitions.Count; i < minRowCount; i++)
            {
                var gridLength = this.CreateGridLength(rowSizes.ElementAtOrDefault(i),
                                                       HorizontalAutoFill ? GridUnitType.Star : default(GridUnitType?));
                this.RowDefinitions.Add(new RowDefinition
                {
                    Height = gridLength
                });
            }

            foreach (var c in this.Children.OfType <FrameworkElement>())
            {
                c.Visibility = Visibility.Visible;
            }
        }
コード例 #2
0
            public TableView(SlotitemListTable Owner)
            {
                // SetStyle(ControlStyles.DoubleBuffer | ControlStyles.OptimizedDoubleBuffer, true);
                this.DoubleBuffered = true;
                this.Owner          = Owner;
                this.Font           = Owner?.Font;

                this.components   = new System.ComponentModel.Container();
                toolTip           = new ToolTip(this.components);
                toolTip.OwnerDraw = true;

                this.Resize += (s, e) => this.RequestUpdate();
                this.Paint  += (s, e) =>
                {
                    var g      = e.Graphics;
                    var Width  = this.Width - this.Padding.Left - this.Padding.Right;
                    var Height = this.Height - this.Padding.Top - this.Padding.Bottom;

                    g.Clear(this.BackColor);

                    Font font8 = new Font(this.Font.FontFamily, 8);

                    var Ships     = homeport?.Organization?.Ships;
                    var SlotItems = homeport?.Itemyard?.SlotItems.Select(_ => _.Value)
                                    .OrderBy(_ => _.Info.Id)
                                    .GroupBy(_ => _.Info.Id);

                    #region Cell Size Calculate
                    ColumnSizes[0] = SlotItems?.Count() > 0
                                                ? (SlotItems?.Max(__ =>
                                                                  __.Max(_ => TextRenderer.MeasureText(_.Info.Name.ToString(), this.Font).Width)
                                                                  ) ?? 0) + 20
                                                : 0;
                    ColumnSizes[1] = SlotItems?.Count() > 0
                                                ? (SlotItems?.Max(_ => TextRenderer.MeasureText(_.Count().ToString(), this.Font).Width) ?? 0)
                                                : 0;
                    ColumnSizes[2] = ColumnSizes[3] = ColumnSizes[4] = 0;


                    ColumnSizes[0] = Math.Max(ColumnSizes[0], TextRenderer.MeasureText(Headers[0], this.Font).Width) + 8;
                    ColumnSizes[1] = Math.Max(ColumnSizes[1], TextRenderer.MeasureText(Headers[1], this.Font).Width) + 8;
                    ColumnSizes[2] = Math.Max(ColumnSizes[2], TextRenderer.MeasureText(Headers[2], this.Font).Width) + 8;
                    ColumnSizes[3] = Math.Max(ColumnSizes[3], TextRenderer.MeasureText(Headers[3], this.Font).Width) + 8;
                    ColumnSizes[4] = Math.Max(ColumnSizes[4], TextRenderer.MeasureText(Headers[4], this.Font).Width) + 8;
                    ColumnSizes[5] = 0;

                    ColumnSizes[5] = (this.Owner?.Width ?? this.Width) - ColumnSizes.Sum() - 1 - 18;
                    #endregion

                    int x, y = 0;
                    using (Pen p = new Pen(Color.FromArgb(83, 83, 83), 1.0f))
                    {
                        SlotItemMap.Clear();

                        #region Data Rendering
                        if (SlotItems != null)
                        {
                            Color colorWhite           = Color.White;
                            Color colorDarkGray        = Color.FromArgb(0x20, 0x90, 0x90, 0x90);
                            Color colorGray            = Color.FromArgb(0x40, 0xC4, 0xC4, 0xC4);
                            Color colorLevel           = Color.FromArgb(0x45, 0xA9, 0xA5);
                            Color colorProficiency123  = Color.FromArgb(0x98, 0xB3, 0xCE);
                            Color colorProficiency4567 = Color.FromArgb(0xD4, 0x9C, 0x0F);
                            int   idx = 0;
                            y = 0;

                            foreach (var slotitemIdGroup in SlotItems)
                            {
                                if (slotitemIdGroup == null)
                                {
                                    continue;
                                }

                                int widthValue, nx;
                                x  = 0;
                                y -= 2;

                                var slotitemLevelGroup = slotitemIdGroup
                                                         .GroupBy(_ => _.NameWithLevel);

                                if (idx % 2 == 1)
                                {
                                    int py = y;

                                    #region Calcuate Equipped Ships Size
                                    foreach (var slotitems in slotitemLevelGroup)
                                    {
                                        int nx2           = x;
                                        var EquippedShips = Ships.Where(
                                            _ => _.Value.Slots.Any(__ => slotitems.Any(___ => ___.Id == __.Item.Id)) ||
                                            (slotitems.Any(___ => ___.Id == _.Value.ExSlot?.Item.Id))
                                            ).Select(_ => _.Value);

                                        foreach (var ship in EquippedShips)
                                        {
                                            int sizeName  = 0;
                                            int sizeLevel = 0;
                                            int sizeCount = 0;
                                            int hasCount  = ship.Slots.Count(_ => slotitems.Any(__ => __.Id == _.Item.Id))
                                                            + (slotitems.Any(_ => _.Id == ship.ExSlot?.Item.Id) ? 1 : 0);

                                            sizeName  = TextRenderer.MeasureText(ship.Info.Name, this.Font).Width - 2;
                                            sizeLevel = TextRenderer.MeasureText("Lv." + ship.Level.ToString(), font8).Width;
                                            if (hasCount > 1)
                                            {
                                                sizeCount = TextRenderer.MeasureText("x " + hasCount.ToString(), font8).Width + 1;
                                            }

                                            if ((x - nx2) + sizeName + sizeLevel + sizeCount > ColumnSizes[5])
                                            {
                                                x  = nx2;
                                                y += RowSize;
                                            }
                                            x += sizeName + sizeLevel + sizeCount + 8;
                                        }
                                    }
                                    #endregion

                                    using (SolidBrush b = new SolidBrush(Color.FromArgb(0x18, 0x90, 0x90, 0x90)))
                                        g.FillRectangle(b, new Rectangle(0, py, Width, y - py + RowSize));

                                    x = 0;
                                    y = py;
                                }

                                #region Icon And Name
                                Image icon = ImageAssets.GetSlotIconImage(slotitemIdGroup.First().Info.IconType);
                                g.DrawImage(icon, new Rectangle(x + 4, y + 2, 18, 18));

                                TextRenderer.DrawText(
                                    g,
                                    slotitemIdGroup.First().Info.Name,
                                    this.Font,
                                    new Rectangle(x + 20 + 3, y, ColumnSizes[0] - 8, RowSize),
                                    colorWhite,
                                    TextFormatFlags.VerticalCenter | TextFormatFlags.Left
                                    );
                                SlotItemMap.Add(new Rectangle(x, y, ColumnSizes[0], RowSize), slotitemIdGroup.First());
                                x += ColumnSizes[0];
                                #endregion

                                #region Items count (Group)
                                TextRenderer.DrawText(
                                    g,
                                    slotitemIdGroup.Count().ToString(),
                                    this.Font,
                                    new Rectangle(x + 3, y, ColumnSizes[1] - 8, RowSize),
                                    colorWhite,
                                    TextFormatFlags.VerticalCenter | TextFormatFlags.Left
                                    );
                                x += ColumnSizes[1];
                                #endregion

                                nx = x;
                                foreach (var slotitems in slotitemLevelGroup)
                                {
                                    if (slotitems == null)
                                    {
                                        continue;
                                    }

                                    var slotitem = slotitems.First();

                                    #region Item Level
                                    TextRenderer.DrawText(
                                        g,
                                        "★" + (slotitem.Level == 10 ? "max" : "+" + slotitem.Level.ToString()),
                                        this.Font,
                                        new Rectangle(x + 3, y, ColumnSizes[2] - 8, RowSize),
                                        slotitem.Level > 0 ? colorLevel : colorDarkGray,
                                        TextFormatFlags.VerticalCenter | TextFormatFlags.Left
                                        );
                                    x += ColumnSizes[2];
                                    #endregion

                                    #region Item Proficiency
                                    TextRenderer.DrawText(
                                        g,
                                        "+" + slotitem.Proficiency.ToString(),
                                        this.Font,
                                        new Rectangle(x + 3, y, ColumnSizes[3] - 8, RowSize),
                                        slotitem.Proficiency >= 4
                                                                                ? colorProficiency4567
                                                                                : (
                                            slotitem.Proficiency >= 1 && slotitem.Proficiency <= 3
                                                                                        ? colorProficiency123
                                                                                        : colorDarkGray
                                            ),
                                        TextFormatFlags.VerticalCenter | TextFormatFlags.Left
                                        );
                                    x += ColumnSizes[3];
                                    #endregion

                                    #region Items count
                                    widthValue = TextRenderer.MeasureText(
                                        slotitems.Count().ToString(),
                                        this.Font
                                        ).Width;

                                    TextRenderer.DrawText(
                                        g,
                                        slotitems.Count().ToString(),
                                        this.Font,
                                        new Rectangle(x + 3, y, ColumnSizes[4] - 8, RowSize),
                                        colorWhite,
                                        TextFormatFlags.VerticalCenter | TextFormatFlags.Left
                                        );
                                    TextRenderer.DrawText(
                                        g,
                                        "(" + slotitems.Count(
                                            _ => !Ships.Any(
                                                __ => __.Value.Slots.Any(___ => ___.Item.Id == _.Id) ||
                                                (__.Value.ExSlot?.Item.Id == _.Id)
                                                )
                                            ) + ")",
                                        font8,
                                        new Rectangle(x + widthValue + 3, y, ColumnSizes[4] - 8, RowSize - 4),
                                        colorGray,
                                        TextFormatFlags.Bottom | TextFormatFlags.Left
                                        );
                                    x += ColumnSizes[4];
                                    #endregion

                                    #region Equipped Ships
                                    int nx2           = x;
                                    var EquippedShips = Ships.Where(
                                        _ => _.Value.Slots.Any(__ => slotitems.Any(___ => ___.Id == __.Item.Id)) ||
                                        (slotitems.Any(___ => ___.Id == _.Value.ExSlot?.Item.Id))
                                        ).Select(_ => _.Value);

                                    foreach (var ship in EquippedShips)
                                    {
                                        int sizeName  = 0;
                                        int sizeLevel = 0;
                                        int sizeCount = 0;
                                        int hasCount  = ship.Slots.Count(_ => slotitems.Any(__ => __.Id == _.Item.Id))
                                                        + (slotitems.Any(_ => _.Id == ship.ExSlot?.Item.Id) ? 1 : 0);

                                        sizeName  = TextRenderer.MeasureText(ship.Info.Name, this.Font).Width - 2;
                                        sizeLevel = TextRenderer.MeasureText("Lv." + ship.Level.ToString(), font8).Width;
                                        if (hasCount > 1)
                                        {
                                            sizeCount = TextRenderer.MeasureText("x " + hasCount.ToString(), font8).Width + 1;
                                        }

                                        if ((x - nx2) + sizeName + sizeLevel + sizeCount > ColumnSizes[5])
                                        {
                                            x  = nx2;
                                            y += RowSize;
                                        }

                                        TextRenderer.DrawText(g, ship.Info.Name, this.Font, new Point(x, y + 4), colorWhite);
                                        TextRenderer.DrawText(g, "Lv." + ship.Level.ToString(), font8, new Point(x + sizeName, y + 4 + 2), colorGray);
                                        if (hasCount > 1)
                                        {
                                            using (SolidBrush b = new SolidBrush(Color.FromArgb(0x20, 0x20, 0x20)))
                                                g.FillRectangle(b, new Rectangle(x + sizeName + sizeLevel, y + 4, sizeCount, RowSize - 4 - 4));

                                            TextRenderer.DrawText(g, "x " + hasCount.ToString(), font8, new Point(x + sizeName + sizeLevel + 1, y + 4 + 1), colorGray);
                                        }
                                        x += sizeName + sizeLevel + sizeCount + 8;
                                    }
                                    #endregion

                                    y += RowSize;
                                    x  = nx;
                                }                                 // GroupBy LevelProficiency

                                idx++;
                                y += 3;
                                g.DrawLine(p, 0, y - 3, Width, y - 3);
                            }                             // GroupBy Id
                        }
                        #endregion
                    }

                    var ResultSize = new Size(
                        ColumnSizes.Sum() + this.Padding.Left + this.Padding.Right + 1,
                        y + this.Padding.Top + this.Padding.Bottom + 1
                        );
                    if (ResultSize.Width != LatestSize.Width || ResultSize.Height != LatestSize.Height)
                    {
                        LatestSize = ResultSize;
                        this.PerformAutoScale();
                        this.PerformLayout();
                        this.Owner.RequestUpdate();
                    }
                };

                var toolTipFont = new Font(this.Font.FontFamily, 10);
                toolTip.Popup += (s, e) =>
                {
                    if (CurrentItem == null)
                    {
                        e.Cancel = true;
                        return;
                    }

                    var text = CurrentItem.Info.Name + Environment.NewLine + CurrentItem.Info.ToolTipData;
                    var sz   = TextRenderer.MeasureText(text, toolTipFont);
                    e.ToolTipSize = new Size(sz.Width + 6, sz.Height + 6);
                };
                toolTip.Draw += (s, e) =>
                {
                    var g = e.Graphics;
                    g.Clear(Color.FromArgb(0x27, 0x27, 0x2F));
                    g.DrawRectangle(
                        new Pen(Color.FromArgb(0x44, 0x44, 0x4A), 1.0f),
                        new Rectangle(e.Bounds.Left, e.Bounds.Top, e.Bounds.Width - 1, e.Bounds.Height - 1)
                        );
                    TextRenderer.DrawText(
                        g,
                        e.ToolTipText,
                        toolTipFont,
                        e.Bounds,
                        Color.FromArgb(255, 255, 255),
                        TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter
                        );
                };

                this.MouseMove += (s, e) =>
                {
                    if (!this.SlotItemMap.Any(x => x.Key.Contains(e.X, e.Y)))
                    {
                        CurrentItem = null;
                        toolTip.Hide(this);
                        return;
                    }

                    var item = this.SlotItemMap.FirstOrDefault(x => x.Key.Contains(e.X, e.Y)).Value;
                    if (item == CurrentItem)
                    {
                        return;
                    }

                    CurrentItem = item;
                    toolTip.Show(CurrentItem.Info.Name + Environment.NewLine + CurrentItem.Info.ToolTipData, this);
                };
                this.MouseDown += (s, e) =>
                {
                    if (!this.SlotItemMap.Any(x => x.Key.Contains(e.X, e.Y)))
                    {
                        CurrentItem = null;
                        toolTip.Hide(this);
                        return;
                    }

                    var item = this.SlotItemMap.FirstOrDefault(x => x.Key.Contains(e.X, e.Y)).Value;
                    CurrentItem = item;
                    toolTip.Show(CurrentItem.Info.Name + Environment.NewLine + CurrentItem.Info.ToolTipData, this);
                };
            }
コード例 #3
0
            public TableView(ShipListTable Owner)
            {
                SetStyle(ControlStyles.DoubleBuffer | ControlStyles.OptimizedDoubleBuffer, true);
                this.Owner = Owner;

                this.Resize += (s, e) => this.RequestUpdate();
                this.Paint  += (s, e) =>
                {
                    var g      = e.Graphics;
                    var Width  = this.Width - this.Padding.Left - this.Padding.Right;
                    var Height = this.Height - this.Padding.Top - this.Padding.Bottom;

                    g.Clear(this.BackColor);

                    #region Filtering
                    var Ships = homeport?.Organization?.Ships.Select(_ => _.Value);
                    if (Ships != null)
                    {
                        if (ShipTypes != null)
                        {
                            Ships = Ships.Where(_ => this.ShipTypes.Contains(_.Info.ShipType.Id));
                        }

                        Ships = Ships.Where(_ =>
                                            (_.Level >= this.LevelFrom) && (_.Level <= this.LevelTo)
                                            );

                        if (this.ExceptExpedition)
                        {
                            Ships = Ships.Where(_ =>
                                                (_.FleetId == -1) || ((!homeport?.Organization?.Fleets[_.FleetId]?.Expedition?.IsInExecution) ?? false)
                                                );
                        }

                        if (this.LockFilter == FilterValues.Yes)
                        {
                            Ships = Ships.Where(_ => _.IsLocked);
                        }
                        else if (this.LockFilter == FilterValues.No)
                        {
                            Ships = Ships.Where(_ => !_.IsLocked);
                        }

                        if (this.SpeedFilter == FilterValues.SuperFast)
                        {
                            Ships = Ships.Where(_ => _.Info.Speed == ShipSpeed.SuperFast);
                        }
                        else if (this.SpeedFilter == FilterValues.FastPlus)
                        {
                            Ships = Ships.Where(_ => _.Info.Speed == ShipSpeed.FastPlus);
                        }
                        else if (this.SpeedFilter == FilterValues.Fast)
                        {
                            Ships = Ships.Where(_ => _.Info.Speed == ShipSpeed.Fast);
                        }
                        else if (this.SpeedFilter == FilterValues.Slow)
                        {
                            Ships = Ships.Where(_ => _.Info.Speed == ShipSpeed.Slow);
                        }

                        if (this.PowerupFilter == FilterValues.End)
                        {
                            Ships = Ships.Where(_ => _.IsMaxModernized);
                        }
                        else if (this.PowerupFilter == FilterValues.NotEnd)
                        {
                            Ships = Ships.Where(_ => !_.IsMaxModernized);
                        }
                    }
                    Ships = Ships?.OrderByDescending(_ => _.Exp);
                    #endregion

                    Font font7 = new Font(this.Font.FontFamily, 7);

                    int widthLevelLv    = TextRenderer.MeasureText("Lv.", font7).Width - 4;
                    int widthLevelNext  = TextRenderer.MeasureText("Next:", font7).Width - 3;
                    int widthLevelInfo  = widthLevelLv + widthLevelNext + 6;
                    int widthPowerupMax = TextRenderer.MeasureText("MAX", font7).Width - 3;

                    #region Cell Size Calculate
                    ColumnSizes[1] = Ships?.Count() > 0 ? (Ships?.Max(_ => TextRenderer.MeasureText(_.Id.ToString(), this.Font).Width) ?? 0) : 0;
                    ColumnSizes[2] = Ships?.Count() > 0 ? (Ships?.Max(_ => TextRenderer.MeasureText(_.Info.ShipType.Name, this.Font).Width) ?? 0) : 0;
                    ColumnSizes[3] = Ships?.Count() > 0 ? (Ships?.Max(_ => TextRenderer.MeasureText(_.Info.Name, this.Font).Width) ?? 0) : 0;
                    ColumnSizes[4] = Ships?.Count() > 0 ? (Ships?.Max(_ =>
                                                                      TextRenderer.MeasureText(_.Level.ToString(), this.Font).Width
                                                                      + TextRenderer.MeasureText(_.ExpForNextLevel.ToString(), font7).Width
                                                                      + widthLevelInfo
                                                                      ) ?? 0) : 0;
                    ColumnSizes[8] = Ships?.Count() > 0 ? (Ships?.Max(_ =>
                                                                      TextRenderer.MeasureText(_.Firepower.Current.ToString(), this.Font).Width
                                                                      + widthPowerupMax
                                                                      ) ?? 0) : 0;
                    ColumnSizes[9] = Ships?.Count() > 0 ? (Ships?.Max(_ =>
                                                                      TextRenderer.MeasureText(_.Torpedo.Current.ToString(), this.Font).Width
                                                                      + widthPowerupMax
                                                                      ) ?? 0) : 0;
                    ColumnSizes[10] = Ships?.Count() > 0 ? (Ships?.Max(_ =>
                                                                       TextRenderer.MeasureText(_.YasenFp.Current.ToString(), this.Font).Width
                                                                       + widthPowerupMax
                                                                       ) ?? 0) : 0;
                    ColumnSizes[11] = Ships?.Count() > 0 ? (Ships?.Max(_ =>
                                                                       TextRenderer.MeasureText(_.Armor.Current.ToString(), this.Font).Width
                                                                       + widthPowerupMax
                                                                       ) ?? 0) : 0;
                    ColumnSizes[12] = Ships?.Count() > 0 ? (Ships?.Max(_ =>
                                                                       TextRenderer.MeasureText(_.AA.Current.ToString(), this.Font).Width
                                                                       + widthPowerupMax
                                                                       ) ?? 0) : 0;
                    ColumnSizes[13] = Ships?.Count() > 0 ? (Ships?.Max(_ =>
                                                                       TextRenderer.MeasureText(_.ASW.Current.ToString(), this.Font).Width
                                                                       + widthPowerupMax
                                                                       ) ?? 0) : 0;
                    ColumnSizes[14] = Ships?.Count() > 0 ? (Ships?.Max(_ =>
                                                                       TextRenderer.MeasureText(_.Luck.Current.ToString(), this.Font).Width
                                                                       + widthPowerupMax
                                                                       ) ?? 0) : 0;

                    ColumnSizes[0] = Math.Max(
                        TextRenderer.MeasureText(Ships?.Count().ToString(), this.Font).Width,
                        16
                        ) + 8;
                    ColumnSizes[1]  = Math.Max(ColumnSizes[1], TextRenderer.MeasureText(Headers[1], this.Font).Width) + 8;
                    ColumnSizes[2]  = Math.Max(ColumnSizes[2], TextRenderer.MeasureText(Headers[2], this.Font).Width) + 8;
                    ColumnSizes[3]  = Math.Max(ColumnSizes[3], TextRenderer.MeasureText(Headers[3], this.Font).Width) + 8;
                    ColumnSizes[4]  = Math.Max(ColumnSizes[4], TextRenderer.MeasureText(Headers[4], this.Font).Width) + 8;
                    ColumnSizes[5]  = TextRenderer.MeasureText(Headers[5], this.Font).Width + 8;
                    ColumnSizes[6]  = TextRenderer.MeasureText(Headers[6], this.Font).Width + 8;
                    ColumnSizes[7]  = TextRenderer.MeasureText(Headers[7], this.Font).Width + 8;
                    ColumnSizes[8]  = Math.Max(ColumnSizes[8], TextRenderer.MeasureText(Headers[8], this.Font).Width) + 8;
                    ColumnSizes[9]  = Math.Max(ColumnSizes[9], TextRenderer.MeasureText(Headers[9], this.Font).Width) + 8;
                    ColumnSizes[10] = Math.Max(ColumnSizes[10], TextRenderer.MeasureText(Headers[10], this.Font).Width) + 8;
                    ColumnSizes[11] = Math.Max(ColumnSizes[11], TextRenderer.MeasureText(Headers[11], this.Font).Width) + 8;
                    ColumnSizes[12] = Math.Max(ColumnSizes[12], TextRenderer.MeasureText(Headers[12], this.Font).Width) + 8;
                    ColumnSizes[13] = Math.Max(ColumnSizes[13], TextRenderer.MeasureText(Headers[13], this.Font).Width) + 8;
                    ColumnSizes[14] = Math.Max(ColumnSizes[14], TextRenderer.MeasureText(Headers[14], this.Font).Width) + 8;
                    ColumnSizes[15] = TextRenderer.MeasureText(Headers[15], this.Font).Width + 8;
                    ColumnSizes[16] = TextRenderer.MeasureText(Headers[16], this.Font).Width + 8;
                    ColumnSizes[17] = Math.Max(
                        TextRenderer.MeasureText("00:00:00", this.Font).Width,
                        TextRenderer.MeasureText(Headers[17], this.Font).Width
                        ) + 8;
                    #endregion

                    int x, y = 0;
                    using (Pen p = new Pen(Color.FromArgb(83, 83, 83), 1.0f))
                    {
                        #region Data Rendering
                        if (Ships != null)
                        {
                            Color colorWhite    = Color.White;
                            Color colorDarkGray = Color.FromArgb(0x20, 0x90, 0x90, 0x90);
                            Color colorGray     = Color.FromArgb(0x40, 0xC4, 0xC4, 0xC4);
                            int   idx           = 0;
                            y = 0;

                            foreach (var ship in Ships)
                            {
                                int widthValue;
                                x  = 0;
                                y -= 2;

                                if (idx % 2 == 1)
                                {
                                    using (SolidBrush b = new SolidBrush(Color.FromArgb(0x18, 0x90, 0x90, 0x90)))
                                        g.FillRectangle(b, new Rectangle(0, y, Width, RowSize));
                                }

                                #region Index
                                TextRenderer.DrawText(
                                    g,
                                    (idx + 1).ToString(),
                                    this.Font,
                                    new Rectangle(x + 3, y, ColumnSizes[0] - 8, RowSize),
                                    colorDarkGray,
                                    TextFormatFlags.VerticalCenter | TextFormatFlags.Left
                                    );
                                x += ColumnSizes[0];
                                #endregion

                                #region Ship ID
                                TextRenderer.DrawText(
                                    g,
                                    ship.Id.ToString(),
                                    this.Font,
                                    new Rectangle(x + 3, y, ColumnSizes[1] - 8, RowSize),
                                    colorGray,
                                    TextFormatFlags.VerticalCenter | TextFormatFlags.Left
                                    );
                                x += ColumnSizes[1];
                                #endregion

                                #region Ship Type Name
                                TextRenderer.DrawText(
                                    g,
                                    ship.Info.ShipType.Name,
                                    this.Font,
                                    new Rectangle(x + 3, y, ColumnSizes[2] - 8, RowSize),
                                    colorGray,
                                    TextFormatFlags.VerticalCenter | TextFormatFlags.Left
                                    );
                                x += ColumnSizes[2];
                                #endregion

                                #region Ship Name
                                TextRenderer.DrawText(
                                    g,
                                    ship.Info.Name,
                                    this.Font,
                                    new Rectangle(x + 3, y, ColumnSizes[3] - 8, RowSize),
                                    colorWhite,
                                    TextFormatFlags.VerticalCenter | TextFormatFlags.Left
                                    );
                                x += ColumnSizes[3];
                                #endregion

                                #region Ship Level
                                widthValue = TextRenderer.MeasureText(ship.Level.ToString(), this.Font).Width;
                                TextRenderer.DrawText(
                                    g,
                                    "Lv.",
                                    font7,
                                    new Rectangle(x + 3, y, ColumnSizes[4] - 8, RowSize - 3),
                                    colorGray,
                                    TextFormatFlags.Bottom | TextFormatFlags.Left
                                    );
                                TextRenderer.DrawText(
                                    g,
                                    ship.Level.ToString(),
                                    this.Font,
                                    new Rectangle(x + widthLevelLv + 2 + 3, y, ColumnSizes[4] - 8 - widthLevelLv - 2, RowSize - 3),
                                    colorWhite,
                                    TextFormatFlags.Bottom | TextFormatFlags.Left
                                    );
                                TextRenderer.DrawText(
                                    g,
                                    "Next:",
                                    font7,
                                    new Rectangle(
                                        x + widthLevelLv + 2 + widthValue + 2 + 3,
                                        y,
                                        ColumnSizes[4] - 8 - widthLevelLv - 2 - widthValue - 4,
                                        RowSize - 3
                                        ),
                                    colorGray,
                                    TextFormatFlags.Bottom | TextFormatFlags.Left
                                    );
                                TextRenderer.DrawText(
                                    g,
                                    ship.ExpForNextLevel.ToString(),
                                    font7,
                                    new Rectangle(
                                        x + widthLevelLv + 2 + widthValue + 2 + widthLevelNext + 3,
                                        y,
                                        ColumnSizes[4] - 8 - widthLevelLv - 2 - widthValue - 4 - widthLevelNext - 3,
                                        RowSize - 3
                                        ),
                                    colorGray,
                                    TextFormatFlags.Bottom | TextFormatFlags.Left
                                    );
                                x += ColumnSizes[4];
                                #endregion

                                #region Ship Remodel
                                if (ship.RemodelLevel == -1)
                                {
                                    using (SolidBrush b = new SolidBrush(Color.FromArgb(0x38, 0x4C, 0xD1)))
                                        g.FillRectangle(b, new Rectangle(x, y, ColumnSizes[5], RowSize));

                                    TextRenderer.DrawText(
                                        g,
                                        "개장가능",
                                        this.Font,
                                        new Rectangle(x + 3, y, ColumnSizes[5] - 8, RowSize),
                                        colorWhite,
                                        TextFormatFlags.VerticalCenter | TextFormatFlags.Left
                                        );
                                }
                                else if (ship.RemodelLevel > 0)
                                {
                                    TextRenderer.DrawText(
                                        g,
                                        "Lv.",
                                        font7,
                                        new Rectangle(x + 3, y, ColumnSizes[5] - 8, RowSize - 3),
                                        colorGray,
                                        TextFormatFlags.Bottom | TextFormatFlags.Left
                                        );
                                    TextRenderer.DrawText(
                                        g,
                                        ship.RemodelLevel.ToString(),
                                        this.Font,
                                        new Rectangle(x + widthLevelLv + 3, y, ColumnSizes[5] - 8, RowSize),
                                        colorWhite,
                                        TextFormatFlags.VerticalCenter | TextFormatFlags.Left
                                        );
                                }
                                x += ColumnSizes[5];
                                #endregion

                                #region Ship Condition
                                using (SolidBrush b = new SolidBrush(GetCondColor(ship.ConditionType)))
                                    g.FillRectangle(b, new Rectangle(x + 6, y + 7, 9, 9));
                                TextRenderer.DrawText(
                                    g,
                                    ship.Condition.ToString(),
                                    this.Font,
                                    new Rectangle(x + 14 + 3, y, ColumnSizes[6] - 8, RowSize),
                                    colorWhite,
                                    TextFormatFlags.VerticalCenter | TextFormatFlags.Left
                                    );
                                x += ColumnSizes[6];
                                #endregion

                                #region Ship Max HP
                                TextRenderer.DrawText(
                                    g,
                                    ship.HP.Maximum.ToString(),
                                    this.Font,
                                    new Rectangle(x + 3, y, ColumnSizes[7] - 8, RowSize),
                                    colorWhite,
                                    TextFormatFlags.VerticalCenter | TextFormatFlags.Left
                                    );
                                x += ColumnSizes[7];
                                #endregion

                                #region Firepower
                                widthValue = TextRenderer.MeasureText(ship.Firepower.Current.ToString(), this.Font).Width - 4;
                                if (ship.Firepower.IsMax)
                                {
                                    using (SolidBrush b = new SolidBrush(Color.FromArgb(0x7F, 0xB1, 0x3B, 0x2A)))
                                        g.FillRectangle(b, new Rectangle(x, y, ColumnSizes[8], RowSize));
                                }
                                TextRenderer.DrawText(
                                    g,
                                    ship.Firepower.Current.ToString(),
                                    this.Font,
                                    new Rectangle(x + 3, y, ColumnSizes[8] - 8, RowSize),
                                    colorWhite,
                                    TextFormatFlags.VerticalCenter | TextFormatFlags.Left
                                    );
                                if (ship.Firepower.IsMax)
                                {
                                    TextRenderer.DrawText(
                                        g,
                                        "MAX",
                                        font7,
                                        new Rectangle(x + widthValue + 2 + 3, y, ColumnSizes[8] - 8, RowSize - 3),
                                        colorGray,
                                        TextFormatFlags.Bottom | TextFormatFlags.Left
                                        );
                                }
                                else
                                {
                                    TextRenderer.DrawText(
                                        g,
                                        "+" + ship.Firepower.Shortfall.ToString(),
                                        font7,
                                        new Rectangle(x + widthValue + 3, y, ColumnSizes[8] - 8, RowSize - 3),
                                        colorGray,
                                        TextFormatFlags.Bottom | TextFormatFlags.Left
                                        );
                                }
                                x += ColumnSizes[8];
                                #endregion

                                #region Torpedo
                                widthValue = TextRenderer.MeasureText(ship.Torpedo.Current.ToString(), this.Font).Width - 4;
                                if (ship.Torpedo.IsMax)
                                {
                                    using (SolidBrush b = new SolidBrush(Color.FromArgb(0x7F, 0x29, 0x70, 0xAB)))
                                        g.FillRectangle(b, new Rectangle(x, y, ColumnSizes[9], RowSize));
                                }
                                TextRenderer.DrawText(
                                    g,
                                    ship.Torpedo.Current.ToString(),
                                    this.Font,
                                    new Rectangle(x + 3, y, ColumnSizes[9] - 8, RowSize),
                                    colorWhite,
                                    TextFormatFlags.VerticalCenter | TextFormatFlags.Left
                                    );
                                if (ship.Torpedo.IsMax)
                                {
                                    TextRenderer.DrawText(
                                        g,
                                        "MAX",
                                        font7,
                                        new Rectangle(x + widthValue + 2 + 3, y, ColumnSizes[9] - 8, RowSize - 3),
                                        colorGray,
                                        TextFormatFlags.Bottom | TextFormatFlags.Left
                                        );
                                }
                                else
                                {
                                    TextRenderer.DrawText(
                                        g,
                                        "+" + ship.Torpedo.Shortfall.ToString(),
                                        font7,
                                        new Rectangle(x + widthValue + 3, y, ColumnSizes[9] - 8, RowSize - 3),
                                        colorGray,
                                        TextFormatFlags.Bottom | TextFormatFlags.Left
                                        );
                                }
                                x += ColumnSizes[9];
                                #endregion

                                #region Firepower + Torpedo
                                widthValue = TextRenderer.MeasureText(ship.YasenFp.Current.ToString(), this.Font).Width - 4;
                                if (ship.YasenFp.IsMax)
                                {
                                    using (SolidBrush b = new SolidBrush(Color.FromArgb(0x66, 0x33, 0x99)))
                                        g.FillRectangle(b, new Rectangle(x, y, ColumnSizes[10], RowSize));
                                }
                                TextRenderer.DrawText(
                                    g,
                                    ship.YasenFp.Current.ToString(),
                                    this.Font,
                                    new Rectangle(x + 3, y, ColumnSizes[10] - 8, RowSize),
                                    colorWhite,
                                    TextFormatFlags.VerticalCenter | TextFormatFlags.Left
                                    );
                                if (ship.YasenFp.IsMax)
                                {
                                    TextRenderer.DrawText(
                                        g,
                                        "MAX",
                                        font7,
                                        new Rectangle(x + widthValue + 2 + 3, y, ColumnSizes[10] - 8, RowSize - 3),
                                        colorGray,
                                        TextFormatFlags.Bottom | TextFormatFlags.Left
                                        );
                                }
                                else
                                {
                                    TextRenderer.DrawText(
                                        g,
                                        "+" + ship.YasenFp.Shortfall.ToString(),
                                        font7,
                                        new Rectangle(x + widthValue + 3, y, ColumnSizes[10] - 8, RowSize - 3),
                                        colorGray,
                                        TextFormatFlags.Bottom | TextFormatFlags.Left
                                        );
                                }
                                x += ColumnSizes[10];
                                #endregion

                                #region Armor
                                widthValue = TextRenderer.MeasureText(ship.Armor.Current.ToString(), this.Font).Width - 4;
                                if (ship.Armor.IsMax)
                                {
                                    using (SolidBrush b = new SolidBrush(Color.FromArgb(0x7F, 0xD8, 0x98, 0x1A)))
                                        g.FillRectangle(b, new Rectangle(x, y, ColumnSizes[11], RowSize));
                                }
                                TextRenderer.DrawText(
                                    g,
                                    ship.Armor.Current.ToString(),
                                    this.Font,
                                    new Rectangle(x + 3, y, ColumnSizes[11] - 8, RowSize),
                                    colorWhite,
                                    TextFormatFlags.VerticalCenter | TextFormatFlags.Left
                                    );
                                if (ship.Armor.IsMax)
                                {
                                    TextRenderer.DrawText(
                                        g,
                                        "MAX",
                                        font7,
                                        new Rectangle(x + widthValue + 2 + 3, y, ColumnSizes[11] - 8, RowSize - 3),
                                        colorGray,
                                        TextFormatFlags.Bottom | TextFormatFlags.Left
                                        );
                                }
                                else
                                {
                                    TextRenderer.DrawText(
                                        g,
                                        "+" + ship.Armor.Shortfall.ToString(),
                                        font7,
                                        new Rectangle(x + widthValue + 3, y, ColumnSizes[11] - 8, RowSize - 3),
                                        colorGray,
                                        TextFormatFlags.Bottom | TextFormatFlags.Left
                                        );
                                }
                                x += ColumnSizes[11];
                                #endregion

                                #region AA
                                widthValue = TextRenderer.MeasureText(ship.AA.Current.ToString(), this.Font).Width - 4;
                                if (ship.AA.IsMax)
                                {
                                    using (SolidBrush b = new SolidBrush(Color.FromArgb(0x7F, 0xDF, 0x6A, 0x0C)))
                                        g.FillRectangle(b, new Rectangle(x, y, ColumnSizes[12], RowSize));
                                }
                                TextRenderer.DrawText(
                                    g,
                                    ship.AA.Current.ToString(),
                                    this.Font,
                                    new Rectangle(x + 3, y, ColumnSizes[12] - 8, RowSize),
                                    colorWhite,
                                    TextFormatFlags.VerticalCenter | TextFormatFlags.Left
                                    );
                                if (ship.AA.IsMax)
                                {
                                    TextRenderer.DrawText(
                                        g,
                                        "MAX",
                                        font7,
                                        new Rectangle(x + widthValue + 2 + 3, y, ColumnSizes[12] - 8, RowSize - 3),
                                        colorGray,
                                        TextFormatFlags.Bottom | TextFormatFlags.Left
                                        );
                                }
                                else
                                {
                                    TextRenderer.DrawText(
                                        g,
                                        "+" + ship.AA.Shortfall.ToString(),
                                        font7,
                                        new Rectangle(x + widthValue + 3, y, ColumnSizes[12] - 8, RowSize - 3),
                                        colorGray,
                                        TextFormatFlags.Bottom | TextFormatFlags.Left
                                        );
                                }
                                x += ColumnSizes[12];
                                #endregion

                                #region ASW
                                widthValue = TextRenderer.MeasureText(ship.ASW.Current.ToString(), this.Font).Width - 4;
                                if (ship.ASW.IsMax)
                                {
                                    using (SolidBrush b = new SolidBrush(Color.FromArgb(0x8B, 0xA2, 0xB0)))
                                        g.FillRectangle(b, new Rectangle(x, y, ColumnSizes[13], RowSize));
                                }
                                TextRenderer.DrawText(
                                    g,
                                    ship.ASW.Current.ToString(),
                                    this.Font,
                                    new Rectangle(x + 3, y, ColumnSizes[13] - 8, RowSize),
                                    colorWhite,
                                    TextFormatFlags.VerticalCenter | TextFormatFlags.Left
                                    );
                                if (ship.ASW.IsMax)
                                {
                                    TextRenderer.DrawText(
                                        g,
                                        "MAX",
                                        font7,
                                        new Rectangle(x + widthValue + 2 + 3, y, ColumnSizes[13] - 8, RowSize - 3),
                                        colorGray,
                                        TextFormatFlags.Bottom | TextFormatFlags.Left
                                        );
                                }
                                else
                                {
                                    TextRenderer.DrawText(
                                        g,
                                        "+" + ship.ASW.Shortfall.ToString(),
                                        font7,
                                        new Rectangle(x + widthValue + 3, y, ColumnSizes[13] - 8, RowSize - 3),
                                        colorGray,
                                        TextFormatFlags.Bottom | TextFormatFlags.Left
                                        );
                                }
                                x += ColumnSizes[13];
                                #endregion

                                #region Luck
                                widthValue = TextRenderer.MeasureText(ship.Luck.Current.ToString(), this.Font).Width - 4;
                                if (ship.Luck.IsMax)
                                {
                                    using (SolidBrush b = new SolidBrush(Color.FromArgb(0x7F, 0x80, 0x80, 0x80)))
                                        g.FillRectangle(b, new Rectangle(x, y, ColumnSizes[14], RowSize));
                                }
                                TextRenderer.DrawText(
                                    g,
                                    ship.Luck.Current.ToString(),
                                    this.Font,
                                    new Rectangle(x + 3, y, ColumnSizes[14] - 8, RowSize),
                                    colorWhite,
                                    TextFormatFlags.VerticalCenter | TextFormatFlags.Left
                                    );
                                if (ship.Luck.IsMax)
                                {
                                    TextRenderer.DrawText(
                                        g,
                                        "MAX",
                                        font7,
                                        new Rectangle(x + widthValue + 2 + 3, y, ColumnSizes[14] - 8, RowSize - 3),
                                        colorGray,
                                        TextFormatFlags.Bottom | TextFormatFlags.Left
                                        );
                                }
                                else
                                {
                                    TextRenderer.DrawText(
                                        g,
                                        "+" + ship.Luck.Shortfall.ToString(),
                                        font7,
                                        new Rectangle(x + widthValue + 3, y, ColumnSizes[14] - 8, RowSize - 3),
                                        colorGray,
                                        TextFormatFlags.Bottom | TextFormatFlags.Left
                                        );
                                }
                                x += ColumnSizes[14];
                                #endregion

                                #region View Range
                                TextRenderer.DrawText(
                                    g,
                                    ship.ViewRange.ToString(),
                                    this.Font,
                                    new Rectangle(x + 3, y, ColumnSizes[15] - 8, RowSize),
                                    colorWhite,
                                    TextFormatFlags.VerticalCenter | TextFormatFlags.Left
                                    );
                                x += ColumnSizes[15];
                                #endregion

                                #region Sally Area
                                if (ship.SallyArea > 0)
                                {
                                    using (SolidBrush b = new SolidBrush(SallyArea.SallyAreaColor(ship.SallyArea)))
                                        g.FillRectangle(b, new Rectangle(x, y, ColumnSizes[16], RowSize));

                                    TextRenderer.DrawText(
                                        g,
                                        SallyArea.SallyAreaName(ship.SallyArea),
                                        this.Font,
                                        new Rectangle(x + 3, y, ColumnSizes[16] - 8, RowSize),
                                        colorWhite,
                                        TextFormatFlags.VerticalCenter | TextFormatFlags.Left
                                        );
                                }
                                x += ColumnSizes[16];
                                #endregion

                                #region Repair Time
                                if ((ship?.TimeToRepair ?? TimeSpan.Zero) != TimeSpan.Zero)
                                {
                                    TextRenderer.DrawText(
                                        g,
                                        ship.RepairTimeString,
                                        this.Font,
                                        new Rectangle(x + 3, y, ColumnSizes[17] - 8, RowSize),
                                        colorWhite,
                                        TextFormatFlags.VerticalCenter | TextFormatFlags.Left
                                        );
                                }
                                x += ColumnSizes[17];
                                #endregion

                                g.DrawLine(p, 0, y + RowSize, Width, y + RowSize);

                                y += RowSize + 3;
                                idx++;
                            }
                        }
                        #endregion
                    }

                    var ResultSize = new Size(
                        ColumnSizes.Sum() + this.Padding.Left + this.Padding.Right + 1,
                        ((Ships?.Count() ?? 0) * (RowSize + 1)) + this.Padding.Top + this.Padding.Bottom + 1
                        );
                    if (ResultSize.Width != LatestSize.Width || ResultSize.Height != LatestSize.Height)
                    {
                        LatestSize = ResultSize;
                        this.PerformAutoScale();
                        this.PerformLayout();
                        this.Owner.RequestUpdate();
                    }
                };
            }