Skip to content

Commit

Permalink
線の表現を背景色からコネクタに変更
Browse files Browse the repository at this point in the history
- ガントチャートの線をコネクタで表現
- (背景色が解放されたので) カレンダーの休日/祝日を着色
- コネクタは色のみカスタマイズ可能
  • Loading branch information
manabedaiki committed Dec 15, 2017
1 parent cc3fe9a commit d4e0ad1
Show file tree
Hide file tree
Showing 10 changed files with 271 additions and 56 deletions.
28 changes: 28 additions & 0 deletions PainlessGantt/Construction/ColorBuilder.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
using YamlDotNet.Serialization;

namespace PainlessGantt.Construction
{
/// <summary>
/// <see cref="IColor"/> インターフェイスの読み書き可能な実装を提供します。
/// </summary>
public sealed class ColorBuilder : IColor
{
/// <summary>
/// 赤成分を取得または設定します。
/// </summary>
[YamlMember(Alias = "赤")]
public byte R { get; set; }

/// <summary>
/// 緑成分を取得または設定します。
/// </summary>
[YamlMember(Alias = "緑")]
public byte G { get; set; }

/// <summary>
/// 青成分を取得または設定します。
/// </summary>
[YamlMember(Alias = "青")]
public byte B { get; set; }
}
}
22 changes: 22 additions & 0 deletions PainlessGantt/Construction/ConfigurationBuilder.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using JetBrains.Annotations;
using YamlDotNet.Serialization;

namespace PainlessGantt.Construction
Expand All @@ -12,10 +13,31 @@ public sealed class ConfigurationBuilder : IConfiguration
/// <summary>
/// 祝日の一覧を取得または設定します。
/// </summary>
[NotNull]
[YamlMember(Alias = "祝日")]
public List<DateTime> Holidays { get; set; } = new List<DateTime>();

/// <inheritdoc />
IReadOnlyCollection<DateTime> IConfiguration.Holidays => Holidays;

/// <summary>
/// 見積もり期間の線の色を取得または設定します。
/// </summary>
[NotNull]
[YamlMember(Alias = "予定線の色")]
public ColorBuilder EstimatedLineColor { get; set; } = new ColorBuilder { R = 0xAA, G = 0xAA, B = 0xAA };

/// <inheritdoc />
IColor IConfiguration.EstimatedLineColor => EstimatedLineColor;

/// <summary>
/// 実際の期間の線の色を取得または設定します。
/// </summary>
[NotNull]
[YamlMember(Alias = "実績線の色")]
public ColorBuilder ActualLineColor { get; set; } = new ColorBuilder { R = 0x75, G = 0xBF, B = 0xD6 };

/// <inheritdoc />
IColor IConfiguration.ActualLineColor => ActualLineColor;
}
}
15 changes: 0 additions & 15 deletions PainlessGantt/DateRangeExtension.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,21 +26,6 @@ public static IEnumerable<DateTime> AsEnumerable([NotNull] this IDateRange range
return Enumerable.Range(0, daysInRange).Select(x => range.Start.AddDays(x));
}

/// <summary>
/// 指定した日が範囲内かどうかを判断します。
/// </summary>
/// <param name="range">日付の範囲。</param>
/// <param name="date">範囲内かどうかを判断する対象の日。</param>
/// <returns><paramref name="date"/> が <paramref name="range"/> の範囲内の場合は <c>true</c>。それ以外の場合は <c>false</c>。</returns>
public static bool In([NotNull] this IDateRange range, DateTime date)
{
if (range == null)
throw new ArgumentNullException(nameof(range));
if (range.Start == default || range.End == default)
return false;
return range.Start <= date && date <= range.End;
}

/// <summary>
/// 指定した <see cref="IDateRange"/> のシーケンスに含まれている日付の最小値を取得します。
/// </summary>
Expand Down
79 changes: 66 additions & 13 deletions PainlessGantt/GanttSource.cs
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,15 @@ private static void BuildCalendar([NotNull] IGanttSource source, [NotNull] IShee
var row1 = worksheet.GetRow(1);
var row2 = worksheet.GetRow(2);
var row3 = worksheet.GetRow(3);
var row1WeekdayStyle = row1.GetCell(6).CellStyle;
var row1HolidayStyle = row1.GetCell(7).CellStyle;
var row1PublicHolidayStyle = row1.GetCell(8).CellStyle;
var row2WeekdayStyle = row2.GetCell(6).CellStyle;
var row2HolidayStyle = row2.GetCell(7).CellStyle;
var row2PublicHolidayStyle = row3.GetCell(8).CellStyle;
var row3WeekdayStyle = row3.GetCell(6).CellStyle;
var row3HolidayStyle = row3.GetCell(7).CellStyle;
var row3PublicHolidayStyle = row3.GetCell(8).CellStyle;
var cell0T = row0.GetCell(6);
var cell1T = row1.GetCell(6);
var cell2T = row2.GetCell(6);
Expand Down Expand Up @@ -114,14 +123,23 @@ private static void BuildCalendar([NotNull] IGanttSource source, [NotNull] IShee
if (source.Configuration.Holidays.Contains(date))
{
cell1.SetCellValue("祝");
cell1.CellStyle = row1PublicHolidayStyle;
cell2.CellStyle = row2PublicHolidayStyle;
cell3.CellStyle = row3PublicHolidayStyle;
}
else if (date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday)
{
cell1.SetCellValue("休");
cell1.CellStyle = row1HolidayStyle;
cell2.CellStyle = row2HolidayStyle;
cell3.CellStyle = row3HolidayStyle;
}
else
{
cell1.SetCellValue((string)null);
cell1.CellStyle = row1WeekdayStyle;
cell2.CellStyle = row2WeekdayStyle;
cell3.CellStyle = row3WeekdayStyle;
}
cell2.SetCellValue(date);
cell3.SetCellValue(date);
Expand All @@ -138,11 +156,14 @@ private static void BuildCalendar([NotNull] IGanttSource source, [NotNull] IShee

private static void BuildProjects([NotNull] IGanttSource source, [NotNull] ISheet worksheet, [NotNull] IDateRange dateRange)
{
var drawing = (XSSFDrawing)worksheet.CreateDrawingPatriarch();
var row4 = worksheet.GetRow(4);
var noneStyle = row4.GetCell(6).CellStyle;
var estimatedStyle = row4.GetCell(7).CellStyle;
var overlappedStyle = row4.GetCell(8).CellStyle;
var actualStyle = row4.GetCell(9).CellStyle;
var weekdayStyle = row4.GetCell(6).CellStyle;
var holidayStyle = row4.GetCell(7).CellStyle;
var publicHolidayStyle = row4.GetCell(8).CellStyle;
weekdayStyle.BorderTop = BorderStyle.None;
holidayStyle.BorderTop = BorderStyle.None;
publicHolidayStyle.BorderTop = BorderStyle.None;
var ticketsWithNestAndRowIndex = source
.Projects
.Select(x => new TicketBuilder { Name = x.Name, Children = (List<TicketBuilder>)x.Tickets })
Expand Down Expand Up @@ -204,23 +225,55 @@ private static void BuildProjects([NotNull] IGanttSource source, [NotNull] IShee
{
cell = cell.CopyCellTo(6 + n);
}
if (ticket.EstimatedPeriod.In(date) && ticket.ActualPeriod.In(date))
if (source.Configuration.Holidays.Contains(date))
{
cell.CellStyle = overlappedStyle;
cell.CellStyle = publicHolidayStyle;
}
else if (ticket.EstimatedPeriod.In(date))
else if (date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday)
{
cell.CellStyle = estimatedStyle;
}
else if (ticket.ActualPeriod.In(date))
{
cell.CellStyle = actualStyle;
cell.CellStyle = holidayStyle;
}
else
{
cell.CellStyle = noneStyle;
cell.CellStyle = weekdayStyle;
}
}
if (ticket.EstimatedPeriod.Start != default && ticket.EstimatedPeriod.End != default)
{
var anchor = new XSSFClientAnchor(
dx1: XSSFShape.EMU_PER_POINT * 2,
dy1: XSSFShape.EMU_PER_POINT * 7,
dx2: XSSFShape.EMU_PER_POINT * -2,
dy2: XSSFShape.EMU_PER_POINT * 7,
col1: 6 + (ticket.EstimatedPeriod.Start - dateRange.Start).Days,
row1: rowIndex,
col2: 6 + (ticket.EstimatedPeriod.End - dateRange.Start).Days + 1,
row2: rowIndex);
var connector = drawing.CreateConnector(anchor);
connector.LineWidth = 6;
connector.SetLineStyleColor(
source.Configuration.EstimatedLineColor.R,
source.Configuration.EstimatedLineColor.G,
source.Configuration.EstimatedLineColor.B);
}
if (ticket.ActualPeriod.Start != default && ticket.ActualPeriod.End != default)
{
var anchor = new XSSFClientAnchor(
dx1: XSSFShape.EMU_PER_POINT * 2,
dy1: XSSFShape.EMU_PER_POINT * 13,
dx2: XSSFShape.EMU_PER_POINT * -2,
dy2: XSSFShape.EMU_PER_POINT * 13,
col1: 6 + (ticket.ActualPeriod.Start - dateRange.Start).Days,
row1: rowIndex,
col2: 6 + (ticket.ActualPeriod.End - dateRange.Start).Days + 1,
row2: rowIndex);
var connector = drawing.CreateConnector(anchor);
connector.LineWidth = 6;
connector.SetLineStyleColor(
source.Configuration.ActualLineColor.R,
source.Configuration.ActualLineColor.G,
source.Configuration.ActualLineColor.B);
}
}
}
}
Expand Down
23 changes: 23 additions & 0 deletions PainlessGantt/IColor.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
namespace PainlessGantt
{
/// <summary>
/// RGB 色を表します。
/// </summary>
public interface IColor
{
/// <summary>
/// 赤成分を取得します。
/// </summary>
byte R { get; }

/// <summary>
/// 緑成分を取得します。
/// </summary>
byte G { get; }

/// <summary>
/// 青成分を取得します。
/// </summary>
byte B { get; }
}
}
14 changes: 14 additions & 0 deletions PainlessGantt/IConfiguration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,19 @@ public interface IConfiguration
/// </summary>
[NotNull]
IReadOnlyCollection<DateTime> Holidays { get; }

/// <summary>
/// 見積もり期間の線の色を取得します。
/// </summary>
/// <seealso cref="ITicket.EstimatedPeriod"/>
[NotNull]
IColor EstimatedLineColor { get; }

/// <summary>
/// 実際の期間の線の色を取得します。
/// </summary>
/// <seealso cref="ITicket.ActualPeriod"/>
[NotNull]
IColor ActualLineColor { get; }
}
}
Loading

0 comments on commit d4e0ad1

Please sign in to comment.