From d5b43dbda787d2537c1c65b513573449f2691bd9 Mon Sep 17 00:00:00 2001 From: Derek Antrican Date: Mon, 22 Jul 2019 12:29:13 -0700 Subject: [PATCH] First commit --- .vs/GanttChart/v16/.suo | Bin 0 -> 14848 bytes .vs/VSWorkspaceState.json | 6 + .vs/slnx.sqlite | Bin 0 -> 253952 bytes ChartEventArgs/CanvasClickedEventArgs.cs | 12 + ChartEventArgs/RowClickedEventArgs.cs | 11 + ChartEventArgs/TimeBlockClickedEventArgs.cs | 16 + GanttChart.csproj | 59 ++ Objects/Chart.cs | 603 +++++++++++++++++ Objects/Row.cs | 28 + Objects/TimeBlock.cs | 43 ++ Properties/AssemblyInfo.cs | 36 + Utilities/Enums.cs | 21 + Utilities/Renderer.cs | 621 ++++++++++++++++++ bin/Debug/GanttChart.dll | Bin 0 -> 38912 bytes bin/Debug/GanttChart.pdb | Bin 0 -> 110080 bytes .../DesignTimeResolveAssemblyReferences.cache | Bin 0 -> 966 bytes ...gnTimeResolveAssemblyReferencesInput.cache | Bin 0 -> 6914 bytes .../GanttChart.csproj.CoreCompileInputs.cache | 1 + .../GanttChart.csproj.FileListAbsolute.txt | 18 + .../GanttChart.csprojAssemblyReference.cache | Bin 0 -> 424 bytes obj/Debug/GanttChart.dll | Bin 0 -> 38912 bytes obj/Debug/GanttChart.pdb | Bin 0 -> 110080 bytes .../GanttChart.csproj.CoreCompileInputs.cache | 1 + .../GanttChart.csprojAssemblyReference.cache | Bin 0 -> 10290 bytes 24 files changed, 1476 insertions(+) create mode 100644 .vs/GanttChart/v16/.suo create mode 100644 .vs/VSWorkspaceState.json create mode 100644 .vs/slnx.sqlite create mode 100644 ChartEventArgs/CanvasClickedEventArgs.cs create mode 100644 ChartEventArgs/RowClickedEventArgs.cs create mode 100644 ChartEventArgs/TimeBlockClickedEventArgs.cs create mode 100644 GanttChart.csproj create mode 100644 Objects/Chart.cs create mode 100644 Objects/Row.cs create mode 100644 Objects/TimeBlock.cs create mode 100644 Properties/AssemblyInfo.cs create mode 100644 Utilities/Enums.cs create mode 100644 Utilities/Renderer.cs create mode 100644 bin/Debug/GanttChart.dll create mode 100644 bin/Debug/GanttChart.pdb create mode 100644 obj/Debug/DesignTimeResolveAssemblyReferences.cache create mode 100644 obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache create mode 100644 obj/Debug/GanttChart.csproj.CoreCompileInputs.cache create mode 100644 obj/Debug/GanttChart.csproj.FileListAbsolute.txt create mode 100644 obj/Debug/GanttChart.csprojAssemblyReference.cache create mode 100644 obj/Debug/GanttChart.dll create mode 100644 obj/Debug/GanttChart.pdb create mode 100644 obj/Release/GanttChart.csproj.CoreCompileInputs.cache create mode 100644 obj/Release/GanttChart.csprojAssemblyReference.cache diff --git a/.vs/GanttChart/v16/.suo b/.vs/GanttChart/v16/.suo new file mode 100644 index 0000000000000000000000000000000000000000..a43b0c444abdedeec40cab29c74fe0108f7f1127 GIT binary patch literal 14848 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 L0sCnM?5F-8c)r|P literal 0 HcmV?d00001 diff --git a/ChartEventArgs/CanvasClickedEventArgs.cs b/ChartEventArgs/CanvasClickedEventArgs.cs new file mode 100644 index 0000000..2a25c32 --- /dev/null +++ b/ChartEventArgs/CanvasClickedEventArgs.cs @@ -0,0 +1,12 @@ +using System; +using System.Drawing; + +namespace GanttChart +{ + public class CanvasClickedEventArgs + { + public DateTime? ClickedLocation { get; set; } + public Row RelatedRow { get; set; } + public Point CursorLocation { get; set; } + } +} diff --git a/ChartEventArgs/RowClickedEventArgs.cs b/ChartEventArgs/RowClickedEventArgs.cs new file mode 100644 index 0000000..4bd9145 --- /dev/null +++ b/ChartEventArgs/RowClickedEventArgs.cs @@ -0,0 +1,11 @@ +using System; +using System.Drawing; + +namespace GanttChart +{ + public class RowClickedEventArgs + { + public Row ClickedRow { get; set; } + public Point CursorLocation { get; set; } + } +} diff --git a/ChartEventArgs/TimeBlockClickedEventArgs.cs b/ChartEventArgs/TimeBlockClickedEventArgs.cs new file mode 100644 index 0000000..91b742f --- /dev/null +++ b/ChartEventArgs/TimeBlockClickedEventArgs.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace GanttChart +{ + public class TimeBlockClickedEventArgs + { + public TimeBlock ClickedTimeBlock { get; set; } + public Row RelatedRow { get; set; } + public Point CursorLocation { get; set; } + } +} diff --git a/GanttChart.csproj b/GanttChart.csproj new file mode 100644 index 0000000..4e5212f --- /dev/null +++ b/GanttChart.csproj @@ -0,0 +1,59 @@ + + + + + Debug + AnyCPU + {82763ACA-980C-475F-84D2-0D6497D064F6} + Library + Properties + GanttChart + GanttChart + v4.6 + 512 + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + UserControl + + + + + + + + + + + + \ No newline at end of file diff --git a/Objects/Chart.cs b/Objects/Chart.cs new file mode 100644 index 0000000..a3733f9 --- /dev/null +++ b/Objects/Chart.cs @@ -0,0 +1,603 @@ +using System.Collections.Generic; +using System.Drawing; +using System.Windows.Forms; +using System.Linq; +using System; +using static GanttChart.Enums; +using System.ComponentModel; + +namespace GanttChart +{ + public class Chart : UserControl + { + #region Initializations + public Chart() + { + Init(); + } + + private void Init() + { + this.AutoScroll = true; + this.DoubleBuffered = true; + this.ResizeRedraw = true; + + doubleClickTimer.Tick += doubleClickTimer_Tick; + + NowIndicatorTimer = new System.Timers.Timer() { Interval = 1000 }; //Don't really need such a quick interval but it helps with render issues by refreshing the chart often + NowIndicatorTimer.Elapsed += NowIndicatorTimer_Elapsed; + NowIndicatorTimer.Start(); + NowIndicatorTimer.Enabled = true; + } + + private void NowIndicatorTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) + { + if (IsHandleCreated && !IsDisposed) + this.Invoke((MethodInvoker)delegate { UpdateView(); }); + + NowTick?.Invoke(); + } + #endregion Initializations + + #region Interaction + //Double click vs Single click code from https://docs.microsoft.com/en-us/dotnet/framework/winforms/how-to-distinguish-between-clicks-and-double-clicks + private Rectangle doubleClickRectangle = new Rectangle(); + private Timer doubleClickTimer = new Timer() { Interval = 100 }; + private bool isFirstClick = true; + private bool isDoubleClick = false; + private int milliseconds = 0; + private Point doubleClickLocation = new Point(); + protected override void OnMouseDown(MouseEventArgs e) + { + base.OnMouseDown(e); + + //This is the first mouse click. + if (isFirstClick) + { + isFirstClick = false; + doubleClickLocation = e.Location; + + //Determine the location and size of the double click + //rectangle area to draw around the cursor point. + doubleClickRectangle = new Rectangle( + e.X - (SystemInformation.DoubleClickSize.Width / 2), + e.Y - (SystemInformation.DoubleClickSize.Height / 2), + SystemInformation.DoubleClickSize.Width, + SystemInformation.DoubleClickSize.Height); + Invalidate(); + + //Start the double click timer. + doubleClickTimer.Start(); + } + else //This is the second mouse click. + { + //Verify that the mouse click is within the double click + //rectangle and is within the system-defined double + //click period. + if (doubleClickRectangle.Contains(e.Location) && + milliseconds < SystemInformation.DoubleClickTime) + { + isDoubleClick = true; + } + } + } + + private void doubleClickTimer_Tick(object sender, EventArgs e) + { + milliseconds += 100; + + //The timer has reached the double click time limit. + if (milliseconds >= SystemInformation.DoubleClickTime) + { + doubleClickTimer.Stop(); + + Row clickedRow = null; + Row relatedRow = null; + TimeBlock clickedTimeBlock = null; + foreach (Row row in Rows.Where(p => p.IsVisible)) + { + if (row.Rect.Contains(doubleClickLocation)) + { + clickedRow = row; + break; + } + else if (row.TimeBlocks.Find(p => p.Rect.Contains(doubleClickLocation)) != null) + { + relatedRow = row; + clickedTimeBlock = row.TimeBlocks.Find(p => p.Rect.Contains(doubleClickLocation)); + break; + } + } + + Point eventGlobalLocation = new Point(doubleClickLocation.X + this.Left, + doubleClickLocation.Y + this.Top); + + if (isDoubleClick) + { + if (clickedRow != null) + { + if (clickedRow.IconRect.Contains(doubleClickLocation)) + RowIconDoubleClick?.Invoke(new RowClickedEventArgs() { ClickedRow = clickedRow, CursorLocation = eventGlobalLocation }); + else + RowDoubleClick?.Invoke(new RowClickedEventArgs() { ClickedRow = clickedRow, CursorLocation = eventGlobalLocation }); + } + else if (clickedTimeBlock != null && clickedTimeBlock.Clickable) + TimeBlockDoubleClick?.Invoke(new TimeBlockClickedEventArgs() { ClickedTimeBlock = clickedTimeBlock, RelatedRow = relatedRow, CursorLocation = eventGlobalLocation }); + else if (renderer.MainCanvas.Contains(doubleClickLocation)) + { + Row horizontalRow = Rows.FirstOrDefault(p => p.Rect.Contains(1, doubleClickLocation.Y)); + + DateTime? clickedTime = null; + for (int i = 0; i < renderer.TimeXLocations.Count - 1; i++) //Loop to 1 less than the end so we don't get index exceptions + { + Tuple time = renderer.TimeXLocations[i]; + Rectangle rowRect = horizontalRow.Rect; + rowRect.X = time.Item2; + rowRect.Width = renderer.TimeXLocations[i + 1].Item2 - rowRect.X; + + if (rowRect.Contains(doubleClickLocation)) + { + clickedTime = time.Item1; + break; + } + } + + MainCanvasDoubleClick?.Invoke(new CanvasClickedEventArgs() { RelatedRow = horizontalRow, ClickedLocation = clickedTime, CursorLocation = eventGlobalLocation }); + } + } + else + { + if (clickedRow != null) + { + if (clickedRow.IconRect.Contains(doubleClickLocation)) + RowIconSingleClick?.Invoke(new RowClickedEventArgs() { ClickedRow = clickedRow, CursorLocation = eventGlobalLocation }); + else + RowSingleClick?.Invoke(new RowClickedEventArgs() { ClickedRow = clickedRow, CursorLocation = eventGlobalLocation }); + } + else if (clickedTimeBlock != null && clickedTimeBlock.Clickable) + TimeBlockSingleClick?.Invoke(new TimeBlockClickedEventArgs() { ClickedTimeBlock = clickedTimeBlock, RelatedRow = relatedRow, CursorLocation = eventGlobalLocation }); + else if (renderer.MainCanvas.Contains(doubleClickLocation)) + { + Row horizontalRow = Rows.FirstOrDefault(p => p.Rect.Contains(1, doubleClickLocation.Y)); + + DateTime? clickedTime = null; + for (int i = 0; i < renderer.TimeXLocations.Count - 1; i++) //Loop to 1 less than the end so we don't get index exceptions + { + Tuple time = renderer.TimeXLocations[i]; + Rectangle rowRect = horizontalRow.Rect; + rowRect.X = time.Item2; + rowRect.Width = renderer.TimeXLocations[i + 1].Item2 - rowRect.X; + + if (rowRect.Contains(doubleClickLocation)) + { + clickedTime = time.Item1; + break; + } + } + + MainCanvasSingleClick?.Invoke(new CanvasClickedEventArgs() { RelatedRow = horizontalRow, ClickedLocation = clickedTime, CursorLocation = eventGlobalLocation }); + } + } + + //Allow the MouseDown event handler to process clicks again. + isFirstClick = true; + isDoubleClick = false; + milliseconds = 0; + } + } + #endregion Interaction + + #region Draw Interface + private System.Timers.Timer NowIndicatorTimer; + + private Renderer renderer = new Renderer(); + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + //Don't paint if in design mode + if (IsDesignerHosted || this.DesignMode) + return; + + this.AutoScrollMinSize = renderer.CalculateAutoScrollSize(this.AutoScrollMinSize, this.Size, this.VerticalScroll); + + renderer.Render(e.Graphics, this.AutoScrollPosition, this.AutoScrollMinSize, this.Font); + } + + //Check for "DesignMode" if inside a UserControl + //https://stackoverflow.com/a/708594/2246411 + private bool IsDesignerHosted + { + get + { + Control ctrl = this; + + while (ctrl != null) + { + if ((ctrl.Site != null) && ctrl.Site.DesignMode) + return true; + ctrl = ctrl.Parent; + } + return false; + } + } + #endregion Draw Interface + + #region Public Events + public delegate void MainCanvasSingleClickDelegate(CanvasClickedEventArgs e); + [Category("Gantt Chart")] + public event MainCanvasSingleClickDelegate MainCanvasSingleClick; + + public delegate void MainCanvasDoubleClickDelegate(CanvasClickedEventArgs e); + [Category("Gantt Chart")] + public event MainCanvasDoubleClickDelegate MainCanvasDoubleClick; + + public delegate void RowSingleClickDelegate(RowClickedEventArgs e); + [Category("Gantt Chart")] + public event RowSingleClickDelegate RowSingleClick; + + public delegate void RowDoubleClickDelegate(RowClickedEventArgs e); + [Category("Gantt Chart")] + public event RowDoubleClickDelegate RowDoubleClick; + + public delegate void RowIconSingleClickDelegate(RowClickedEventArgs e); + [Category("Gantt Chart")] + public event RowIconSingleClickDelegate RowIconSingleClick; + + public delegate void RowIconDoubleClickDelegate(RowClickedEventArgs e); + [Category("Gantt Chart")] + public event RowIconDoubleClickDelegate RowIconDoubleClick; + + public delegate void TimeBlockSingleClickDelegate(TimeBlockClickedEventArgs e); + [Category("Gantt Chart")] + public event TimeBlockSingleClickDelegate TimeBlockSingleClick; + + public delegate void TimeBlockDoubleClickDelegate(TimeBlockClickedEventArgs e); + [Category("Gantt Chart")] + public event TimeBlockDoubleClickDelegate TimeBlockDoubleClick; + #endregion Public Events + + #region Public Methods + public void UpdateView() + { + Invalidate(); //Force chart to redraw + } + + public Dictionary> GetNowTimeBlocks() + { + DateTime now = DateTime.Now; + now = now.AddHours(NowIndicatorHourOffset); + + Dictionary> result = new Dictionary>(); + foreach (Row row in Rows) + { + foreach (TimeBlock timeBlock in row.TimeBlocks) + { + if (now >= timeBlock.StartTime && + now <= timeBlock.EndTime) + { + if (result.ContainsKey(row)) + result[row].Add(timeBlock); + else + result.Add(row, new List() { timeBlock }); + } + } + } + + return result; + } + + public void RecaculateFormatDictionaries(bool overwrite = false) + { + if (overwrite) + { + DayLabelFormats.Clear(); + TimeLabelFormats.Clear(); + } + + DateTime curDay = StartDate; + while (curDay < EndDate) + { + int curHour = StartHourInDay; + while (curHour <= EndHourInDay) + { + DateTime dateWithHour = curDay.AddHours(curHour); + + if (!TimeLabelFormats.ContainsKey(dateWithHour)) + TimeLabelFormats.Add(dateWithHour, DefaultTimeLabelFormat); + + curHour++; + } + + if (!DayLabelFormats.ContainsKey(curDay)) + DayLabelFormats.Add(curDay, DefaultDayLabelFormat); + + curDay = curDay.AddDays(1); + } + } + #endregion Public Methods + + #region Public Properties + /// + /// The main data for the chart + /// + [Category("Gantt Chart")] + public List Rows + { + get { return renderer.Rows; } + set { renderer.Rows = value; } + } + + /// + /// The height of the top header (where the horizontal axis labels are) + /// + [Category("Gantt Chart")] + public int TopHeaderHeight + { + get { return renderer.TopHeaderHeight; } + set { renderer.TopHeaderHeight = value; } + } + + /// + /// Controls the minimum width (in pixels) of each timeblock. When the chart is resized, all timeblocks will compress down to this size. + /// Then a horizontal scrollbar will start to appear. + /// + [Category("Gantt Chart")] + public int MinTimeIntervalWidth //= 0; //In pixels. If left to 0, the chart width with always match the width of the parent control (no horizontal scrollbar) + { + get { return renderer.MinTimeIntervalWidth; } + set { renderer.MinTimeIntervalWidth = value; } + } + + /// + /// Controls whether or not the "now indicator" (a red line drawn vertically across the chart) should be shown + /// + [Category("Gantt Chart")] + public bool ShowNowIndicator + { + get { return renderer.ShowNowIndicator; } + set { renderer.ShowNowIndicator = value; } + } + + /// + /// Controls the offset for the now indicator. Useful for displaying the now indicator at a different timezone than the computer's current timezone + /// + [Category("Gantt Chart")] + public int NowIndicatorHourOffset + { + get { return renderer.NowIndicatorHourOffset; } + set { renderer.NowIndicatorHourOffset = value; } + } + + /// + /// Sets whether or not horizontal gridlines (the lines between rows) should be visible + /// + [Category("Gantt Chart")] + public bool HorizontalGridLinesVisible + { + get { return renderer.HorizontalGridLinesVisible; } + set { renderer.HorizontalGridLinesVisible = value; } + } + + /// + /// Sets whether or not vertical gridlines (the lines between days) should be shown + /// + [Category("Gantt Chart")] + public bool VerticalGridLinesVisible + { + get { return renderer.VerticalGridLinesVisible; } + set { renderer.VerticalGridLinesVisible = value; } + } + + /// + /// StartDate is inclusive (chart starts at 00:00 of this day) + /// + [Category("Gantt Chart")] + public DateTime StartDate + { + get { return renderer.StartDate.Date; } + set { renderer.StartDate = value.Date; } + } + + /// + /// EndDate is exclusive (chart ends at 00:00 of this day) + /// + [Category("Gantt Chart")] + public DateTime EndDate + { + get { return renderer.EndDate.Date; } + set { renderer.EndDate = value.Date; } + } + + /// + /// StartHourInDay is inclusive (first hour on the chart for the day will be StartHourInDay). Note: this is only relevant for TimeInterval.Hour + /// + [Category("Gantt Chart")] + public int StartHourInDay + { + get { return renderer.StartHourInDay; } + set { renderer.StartHourInDay = value; } + } + + /// + /// EndHourInDay is exclusive (last hour on the chart for the day will be EndHourInDay). Note: this is only relevant for TimeInterval.Hour + /// + [Category("Gantt Chart")] + public int EndHourInDay + { + get { return renderer.EndHourInDay; } + set { renderer.EndHourInDay = value; } + } + + //Todo: need to support this in the future. IMPORTANT: this may also require a lot of renaming of other properties or functionality + //public TimeInterval TimeInterval = TimeInterval.Hour; //Todo: need to support other time intervals + + /// + /// The format for the time labels + /// + [Category("Gantt Chart")] + public string DefaultTimeLabelFormat //Here is where someone can display military time instead + { + get { return renderer.DefaultTimeLabelFormat; } + set + { + string oldFormat = renderer.DefaultTimeLabelFormat; + renderer.DefaultTimeLabelFormat = value; + + foreach (DateTime key in TimeLabelFormats.Keys.ToList()) + { + if (TimeLabelFormats[key] == oldFormat) + TimeLabelFormats[key] = renderer.DefaultTimeLabelFormat; + } + } + } + + /// + /// The format for the date labels + /// + [Category("Gantt Chart")] + public string DefaultDayLabelFormat + { + get { return renderer.DefaultDayLabelFormat; } + set + { + string oldFormat = renderer.DefaultDayLabelFormat; + renderer.DefaultDayLabelFormat = value; + + foreach (DateTime key in DayLabelFormats.Keys.ToList()) + { + if (DayLabelFormats[key] == oldFormat) + DayLabelFormats[key] = renderer.DefaultDayLabelFormat; + } + } + } + + /// + /// Controls the color of the text of most of the form (timeblock text color automatically adjusts based on timeblock color) + /// + [Category("Gantt Chart")] + public Color TextColor + { + get { return renderer.TextColor; } + set { renderer.TextColor = value; } + } + + /// + /// Controls the background of the row headers + /// + [Category("Gantt Chart")] + public Color HeaderBackgroundColor + { + get { return renderer.HeaderBackgroundColor; } + set { renderer.HeaderBackgroundColor = value; } + } + + /// + /// Controls the background color of the chart canvas area + /// + [Category("Gantt Chart")] + public Color BackgroundColor + { + get { return renderer.BackgroundColor; } + set { renderer.BackgroundColor = value; } + } + + /// + /// Location of the icon in the row header + /// + [Category("Gantt Chart")] + public Corner RowIconLocation + { + get { return renderer.RowIconLocation; } + set { renderer.RowIconLocation = value; } + } + + /// + /// Size of the icon in the row header + /// + [Category("Gantt Chart")] + public Size RowIconSize + { + get { return renderer.RowIconSize; } + set { renderer.RowIconSize = value; } + } + + public delegate void NowTickDelegate(); + /// + /// This event is fired whenver the chart updates its now indicator (about every second). NOTE: this + /// event does not run on the UI thread + /// + [Category("Gantt Chart")] + public event NowTickDelegate NowTick; + + /// + /// Each date shown in the chart along with its X location + /// + [Category("Gantt Chart")] + public IReadOnlyDictionary DayLocations + { + get + { + Dictionary result = new Dictionary(); + renderer.DayXLocations.ForEach(p => + { + result.Add(p.Item1, p.Item2); + }); + + return result; + } + } + + /// + /// Each time shown in the chart along with its X location + /// + [Category("Gantt Chart")] + public IReadOnlyDictionary TimeLocations + { + get + { + Dictionary result = new Dictionary(); + renderer.TimeXLocations.ForEach(p => + { + result.Add(p.Item1, p.Item2); + }); + + return result; + } + } + + /// + /// Controls the time display format for each individual time label + /// Keys are DateTime and Values are string (the DateTime format string) + /// + [Category("Gantt Chart")] + public Dictionary TimeLabelFormats + { + get { return renderer.TimeLabelFormats; } + set { renderer.TimeLabelFormats = value; } + } + + /// + /// Controls the day display format for each individual day label + /// Keys are DateTime and Values are string (the DateTime format string) + /// + [Category("Gantt Chart")] + public Dictionary DayLabelFormats + { + get { return renderer.DayLabelFormats; } + set { renderer.DayLabelFormats = value; } + } + + /// + /// Controls holidays for the form. On each holiday, a cross hatch is drawn through all rows and no timeblocks are shown. + /// Keys are DateTime and Values are string (the name of the Holiday) + /// + [Category("Gantt Chart")] + public Dictionary Holidays + { + get { return renderer.Holidays; } + set { renderer.Holidays = value; } + } + #endregion Public Properties + } +} diff --git a/Objects/Row.cs b/Objects/Row.cs new file mode 100644 index 0000000..d604992 --- /dev/null +++ b/Objects/Row.cs @@ -0,0 +1,28 @@ +using System.Collections.Generic; +using System.Drawing; + +namespace GanttChart +{ + public class Row + { + public Row() + { + IsVisible = true; + TimeBlocks = new List(); + } + + public Row(string text) + { + this.Text = text; + IsVisible = true; + TimeBlocks = new List(); + } + + public virtual string Text { get; set; } + public virtual List TimeBlocks { get; set; } + public virtual Image Icon { get; set; } + public virtual bool IsVisible { get; set; } + public virtual Rectangle Rect { get; set; } + public virtual Rectangle IconRect { get; set; } + } +} diff --git a/Objects/TimeBlock.cs b/Objects/TimeBlock.cs new file mode 100644 index 0000000..8723aee --- /dev/null +++ b/Objects/TimeBlock.cs @@ -0,0 +1,43 @@ +using System; +using System.Drawing; +using System.Xml.Serialization; + +namespace GanttChart +{ + public class TimeBlock + { + public TimeBlock() + { + this.Hatch = false; + this.Clickable = true; + this.IsVisible = true; + } + + public TimeBlock(string text) + { + this.Text = text; + this.Hatch = false; + this.Clickable = true; + this.IsVisible = true; + } + + public TimeBlock(string text, DateTime startTime, DateTime endTime) + { + this.Text = text; + this.StartTime = startTime; + this.EndTime = endTime; + this.Hatch = false; + this.Clickable = true; + this.IsVisible = true; + } + + public virtual string Text { get; set; } + public virtual DateTime StartTime { get; set; } + public virtual DateTime EndTime { get; set; } + public virtual Color Color { get; set; } + public virtual bool Hatch { get; set; } + public virtual bool Clickable { get; set; } + public virtual Rectangle Rect { get; set; } + public virtual bool IsVisible { get; set; } + } +} diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..ac19814 --- /dev/null +++ b/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("GanttChart")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("GanttChart")] +[assembly: AssemblyCopyright("Copyright © 2019")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("82763aca-980c-475f-84d2-0d6497d064f6")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Utilities/Enums.cs b/Utilities/Enums.cs new file mode 100644 index 0000000..403916f --- /dev/null +++ b/Utilities/Enums.cs @@ -0,0 +1,21 @@ + +namespace GanttChart +{ + public class Enums + { + public enum TimeInterval + { + Hour, + //Day, //Todo: add support for day + //Month //Todo: add support for month + } + + public enum Corner + { + SW, + NW, + NE, + SE + } + } +} diff --git a/Utilities/Renderer.cs b/Utilities/Renderer.cs new file mode 100644 index 0000000..968ca1b --- /dev/null +++ b/Utilities/Renderer.cs @@ -0,0 +1,621 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Linq; +using System.Windows.Forms; +using static GanttChart.Enums; + +namespace GanttChart +{ + public class Renderer + { + #region Private Properties + private Graphics graphics; + private Point autoScrollPosition; + private Size autoScrollMinSize; + private StringFormat alignAllCenter = new StringFormat() { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center }; + private StringFormat alignVertCenter = new StringFormat() { LineAlignment = StringAlignment.Center }; + private Font font; + #endregion Private Properties + + #region Constructor + public Renderer() + { + InitDefaultValues(); + } + #endregion Constructor + + #region Public Methods + public void Render(Graphics g, Point autoScrollPosition, Size autoScrollSize, Font font) + { + this.graphics = g; + this.autoScrollPosition = autoScrollPosition; + this.autoScrollMinSize = autoScrollSize; + this.font = font; + + DrawChart(); + } + + public Size CalculateAutoScrollSize(Size autoScrollMinSize, Size size, VScrollProperties verticalScroll) + { + Size autoScrollSize = this.autoScrollMinSize; + + //Dynamically adjust width + if (verticalScroll.Visible) + autoScrollSize.Width = size.Width - SystemInformation.VerticalScrollBarWidth; + else + autoScrollSize.Width = size.Width; + + int timeDivisions = (EndHourInDay - StartHourInDay) * (EndDate - StartDate).Days; + int pixelsPerDivision = autoScrollSize.Width / timeDivisions; + if (pixelsPerDivision < MinTimeIntervalWidth) + { + if (verticalScroll.Visible) + autoScrollSize.Width = timeDivisions * MinTimeIntervalWidth - SystemInformation.VerticalScrollBarWidth; + else + autoScrollSize.Width = timeDivisions * MinTimeIntervalWidth; + } + + //Dynamically adjust height + if (Rows.Count > 0 && Rows.All(p => p.Rect != null)) + { + int highestYValue = Rows.Select(p => { return p.Rect.Bottom; }).Max(); + autoScrollSize.Height = highestYValue + 1; + } + else + autoScrollSize.Height = size.Height; + + if (autoScrollMinSize != autoScrollSize) + autoScrollMinSize = autoScrollSize; + + return autoScrollMinSize; + } + #endregion Public Methods + + #region Private Methods + private void InitDefaultValues() + { + TextColor = Color.Black; + HeaderBackgroundColor = Color.LightBlue; + BackgroundColor = Color.LightGray; + TopHeaderHeight = 40; + DefaultTimeLabelFormat = "htt"; + DefaultDayLabelFormat = "dddd"; + StartHourInDay = 0; + EndHourInDay = 24; + RowIconSize = new Size(15, 15); + RowIconLocation = Corner.SW; + HorizontalGridLinesVisible = false; + VerticalGridLinesVisible = true; + ShowNowIndicator = false; + NowIndicatorHourOffset = 0; + MinTimeIntervalWidth = 0; + + DayXLocations = new List>(); + TimeXLocations = new List>(); + TimeLabelFormats = new Dictionary(); + DayLabelFormats = new Dictionary(); + Rows = new List(); + Holidays = new Dictionary(); + } + + private void PopulateDateTimeXLocs(int startX, int endX) + { + int dayDivision = (int)Math.Round((double)(endX - startX) / (EndDate - StartDate).Days); + int dayXLoc = startX; + DateTime curDay = StartDate; + while (curDay < EndDate) + { + int dayStart = dayXLoc; + int dayEnd = dayXLoc + dayDivision; + + int timeDivision = (int)Math.Round((double)(dayEnd - dayStart) / (EndHourInDay - StartHourInDay)); + int xLoc = dayStart; + int curHour = StartHourInDay; + while (curHour <= EndHourInDay) + { + DateTime dateWithHour = curDay.AddHours(curHour); + + if (curHour == StartHourInDay) + { + StringFormat startFormat = new StringFormat() { Alignment = StringAlignment.Near, LineAlignment = StringAlignment.Far }; + TimeXLocations.Add(new Tuple(dateWithHour, dayStart, startFormat)); + } + else if (curHour == EndHourInDay) + { + StringFormat endFormat = new StringFormat() { Alignment = StringAlignment.Far, LineAlignment = StringAlignment.Far }; + TimeXLocations.Add(new Tuple(dateWithHour, dayEnd, endFormat)); + } + else + { + xLoc += timeDivision; + StringFormat otherFormat = new StringFormat() { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Far }; + TimeXLocations.Add(new Tuple(dateWithHour, xLoc, otherFormat)); + } + + curHour++; + } + + DayXLocations.Add(new Tuple(curDay, dayStart, dayEnd)); + dayXLoc = dayEnd; + + curDay = curDay.AddDays(1); + } + } + + private void DrawChart() + { + ResetGraphics(); + + if (AreHoursValid() && AreDatesValid()) + { + RecaculateFormatDictionaries(); + + Rectangle leftRect = DrawLeftHeaders(0, TopHeaderHeight); + + PopulateDateTimeXLocs(leftRect.Right, autoScrollMinSize.Width); + + Rectangle topRect = DrawTopHeaders(leftRect.Right, 0, autoScrollMinSize.Width, TopHeaderHeight + 1); + + Rectangle mainCanvasRect = DrawMainCanvas(leftRect.Right, topRect.Bottom, autoScrollMinSize.Width, leftRect.Bottom + 1); + MainCanvas = mainCanvasRect; + + DrawTimeBlocks(mainCanvasRect.Left, mainCanvasRect.Top, mainCanvasRect.Right, mainCanvasRect.Bottom); + + DrawHolidays(MainCanvas.Top, MainCanvas.Bottom + 2); + + DrawNowIndicator(topRect.Top, MainCanvas.Bottom + 2); + } + + graphics.Flush(); + } + + private void ResetGraphics() + { + graphics.Clear(BackgroundColor); + graphics.TranslateTransform(this.autoScrollPosition.X, this.autoScrollPosition.Y); + + DayXLocations.Clear(); + TimeXLocations.Clear(); + } + + private Rectangle DrawLeftHeaders(int startX, int startY) + { + int headerWidth = 100; + int headerHeight = 30; + + if (Rows.Count == 0) + return new Rectangle(startX, startY, 0, 0); + + //Increase width if it will not fit the largest string + int maxStringWidth = Rows.Select(p => { return (int)Math.Round(graphics.MeasureString(p.Text, this.font).Width); }).Max(); + if (maxStringWidth > headerWidth) + headerWidth = maxStringWidth + 10; //10 for a "margin" + + int x = startX; + int y = startY; + foreach (Row row in Rows.Where(p => p.IsVisible)) + { + Rectangle headerRect = new Rectangle(x, y, headerWidth, headerHeight); + DrawRect(headerRect, HeaderBackgroundColor, Color.Black); + DrawTextCenter(headerRect, row.Text); + + if (row.Icon != null) + { + Rectangle iconRect = GetIconRect(headerRect); + graphics.DrawImage(row.Icon, iconRect); + row.IconRect = iconRect; + } + + row.Rect = headerRect; + + y += headerRect.Height; + + //Increase AutoScrollMinSize (chart total area) if we overflow the end of the current area + if (y > autoScrollMinSize.Height) + autoScrollMinSize = new Size(autoScrollMinSize.Width, y + 1); //Add 1 for pen width + } + + return new Rectangle(startX, startY, headerWidth - startX, y - startY); //Return the total rect that the rows take up + } + + private Rectangle GetIconRect(Rectangle headerRect) + { + int x, y; + + switch (RowIconLocation) + { + case Corner.NW: + x = headerRect.Left; + y = headerRect.Top; + break; + case Corner.NE: + x = headerRect.Right - RowIconSize.Width; + y = headerRect.Top; + break; + case Corner.SE: + x = headerRect.Right - RowIconSize.Width; + y = headerRect.Bottom - RowIconSize.Height; + break; + default: + case Corner.SW: + x = headerRect.Left; + y = headerRect.Bottom - RowIconSize.Height; + break; + } + + Rectangle iconRect = new Rectangle(x, y, + RowIconSize.Width, + RowIconSize.Height); + + return iconRect; + } + + private Rectangle DrawTopHeaders(int startX, int startY, int endX, int endY) + { + Pen outlinePen = new Pen(Color.Black, 1); + + foreach (Tuple day in DayXLocations) + { + //Draw day rect + Rectangle dayRect = new Rectangle(day.Item2, startY, day.Item3 - day.Item2, endY - startY); + dayRect.Height -= (int)outlinePen.Width; + graphics.DrawRectangle(outlinePen, dayRect); + + //Draw day header + Point dayCenter = new Point(day.Item2 + dayRect.Width / 2, startY + dayRect.Height / 4); + graphics.DrawString(day.Item1.ToString(DayLabelFormats[day.Item1]), this.font, TextBrush, dayCenter, alignAllCenter); + } + + foreach (Tuple timeLabelInfo in TimeXLocations) + { + string timeLabel = GetLabelForTime(timeLabelInfo.Item1); + Point labelLoc = new Point(timeLabelInfo.Item2, endY); + graphics.DrawString(timeLabel, this.font, TextBrush, labelLoc, timeLabelInfo.Item3); + } + + //Adjust rect for return + Rectangle topRect = new Rectangle(startX, startY, endX - startX, endY - startY); + topRect.Height -= (int)outlinePen.Width; + + return topRect; + } + + private Rectangle DrawMainCanvas(int startX, int startY, int endX, int endY) + { + Pen outlinePen = new Pen(Color.Black, 1); + Rectangle canvasRect = new Rectangle(startX, startY, endX - startX, endY - startY); + graphics.DrawRectangle(outlinePen, startX, startY, canvasRect.Width - outlinePen.Width, canvasRect.Height - outlinePen.Width); + + if (VerticalGridLinesVisible) + DrawVerticalGridLines(startX, startY, endX, endY); + + if (HorizontalGridLinesVisible) + DrawHorizontalGridLines(endX); + + //Adjust canvas for return (so that anything drawn to the canvas is inside the "outline") + canvasRect.X += (int)outlinePen.Width; + canvasRect.Width -= (int)outlinePen.Width * 3; + canvasRect.Y += (int)outlinePen.Width; + canvasRect.Height -= (int)outlinePen.Width * 3; + + return canvasRect; + } + + private void DrawTimeBlocks(int startX, int startY, int endX, int endY) + { + foreach (Row row in Rows.Where(p => p.IsVisible)) + { + foreach (TimeBlock timeBlock in row.TimeBlocks.Where(p => p.IsVisible)) + { + //If timeblock is not within visible range, don't draw it + if (timeBlock.StartTime < StartDate || + timeBlock.StartTime.Hour < StartHourInDay || + timeBlock.EndTime.Hour > EndHourInDay || + timeBlock.EndTime >= EndDate) + { + continue; + } + + //If timeblock is on a holiday, don't draw it + if (Holidays.Keys.ToList().Find(p => p.Date == timeBlock.StartTime.Date) != DateTime.MinValue) + continue; + + int timeBlockStartX = GetXLocationForTime(timeBlock.StartTime) + 1; + int timeBlockEndX = GetXLocationForTime(timeBlock.EndTime) - 1; + int timeBlockY = row.Rect.Y + 5; + Rectangle rect = new Rectangle(timeBlockStartX, timeBlockY, timeBlockEndX - timeBlockStartX, 20); + DrawRect(rect, timeBlock.Color, timeBlock.Color, hatch: timeBlock.Hatch); + + timeBlock.Rect = rect; + + DrawTextLeft(rect, timeBlock.Text, GetContrastingTextColor(timeBlock.Color)); + } + } + } + + private void DrawHolidays(int startY, int endY) + { + //Don't draw holidays if there are no rows (because the holiday "block" takes up the height of the row) + if (Rows.Count == 0) + return; + + foreach (KeyValuePair holiday in Holidays) + { + //If holiday is not within visible range, don't draw it + if (holiday.Key < StartDate || + holiday.Key >= EndDate) + { + continue; + } + + Tuple dayLocInfo = DayXLocations.Find(p => p.Item1 == holiday.Key.Date); + if (dayLocInfo != null) + { + Rectangle holidayRect = new Rectangle(dayLocInfo.Item2, + startY, + dayLocInfo.Item3 - dayLocInfo.Item2, + endY - startY); + + graphics.FillRectangle(new HatchBrush(HatchStyle.ForwardDiagonal, Color.White, Color.DimGray), holidayRect); + + //Write holiday name + if (!string.IsNullOrEmpty(holiday.Value)) + { + Font holidayNameFont = new Font(this.font, FontStyle.Bold); + Point holidayRectCenter = new Point(holidayRect.X + holidayRect.Width / 2, startY + 5); + int textWidth = (int)Math.Round(graphics.MeasureString(holiday.Value, holidayNameFont).Width); + int textHeight = (int)Math.Round(graphics.MeasureString(holiday.Value, holidayNameFont).Height); + Rectangle holidayNameRect = new Rectangle(holidayRectCenter.X - textWidth / 2 - 2, //"-2" for left margin of 2 + holidayRectCenter.Y, + textWidth + 4, //"+4" for right margin of 2 (width also includes left margin) + textHeight); + + graphics.FillRectangle(new SolidBrush(Color.White), holidayNameRect); + Point stringLoc = new Point(holidayRectCenter.X, holidayRectCenter.Y + 7); + graphics.DrawString(holiday.Value, holidayNameFont, new SolidBrush(Color.Black), stringLoc, alignAllCenter); + } + } + } + } + + private void DrawNowIndicator(int startY, int endY) + { + if (!ShowNowIndicator || + Rows.Count == 0 || //No rows + !Rows.Any(p => p.TimeBlocks.Count > 0 && p.IsVisible)) //No timeblocks (and isn't invisible) + return; + + DateTime now = DateTime.Now; + now = now.AddHours(NowIndicatorHourOffset); + + //Ensure that "now" should be visible on chart + if (now.Hour < StartHourInDay || + now.Hour > EndHourInDay || + now < StartDate || + now > EndDate) + return; + + Tuple timeBehind = TimeXLocations.LastOrDefault(p => p.Item1 <= now); + Tuple timeAhead = TimeXLocations.FirstOrDefault(p => p.Item1 >= now); + + double percentageOfTimeBlock = (double)(now.Ticks - timeBehind.Item1.Ticks) / (timeAhead.Item1.Ticks - timeBehind.Item1.Ticks); + int nowXLoc = (int)Math.Round(percentageOfTimeBlock * (timeAhead.Item2 - timeBehind.Item2) + timeBehind.Item2); + + //Draw line + Point topPoint = new Point(nowXLoc, startY); + Point bottomPoint = new Point(nowXLoc, endY); + graphics.DrawLine(new Pen(Color.Red), topPoint, bottomPoint); + + //Draw top triangle + Point t1 = new Point(topPoint.X - 5, topPoint.Y); + Point t2 = new Point(topPoint.X + 5, topPoint.Y); + Point t3 = new Point(topPoint.X, topPoint.Y + 10); + graphics.FillPolygon(new SolidBrush(Color.Red), new[] { t1, t2, t3 }); + + //Draw bottom triangle + Point b1 = new Point(bottomPoint.X - 5, bottomPoint.Y); + Point b2 = new Point(bottomPoint.X + 5, bottomPoint.Y); + Point b3 = new Point(bottomPoint.X, bottomPoint.Y - 10); + graphics.FillPolygon(new SolidBrush(Color.Red), new[] { b1, b2, b3 }); + } + + private string GetLabelForTime(DateTime dateAndHour) + { + return dateAndHour.ToString(TimeLabelFormats[dateAndHour]).ToLower(); + } + + private bool AreHoursValid() + { + if (StartHourInDay < 0 || + StartHourInDay > 23) + { + throw new Exception("StartHourInDay is not valid"); + } + else if (EndHourInDay < 0 || + EndHourInDay > 24 || + EndHourInDay <= StartHourInDay) + { + throw new Exception("EndHourInDay is not valid"); + } + else + return true; + } + + private bool AreDatesValid() + { + if (EndDate <= StartDate) + throw new Exception("EndDate cannot be before or the same as StartDate"); + else + return true; + } + + private int GetXLocationForDay(DateTime date) + { + Tuple foundGroup = DayXLocations.Find(p => p.Item1 == date.Date); + if (foundGroup != null) + return foundGroup.Item2; + else + return -1; + } + + private int GetXLocationForTime(DateTime dateAndTime) + { + Tuple foundGroup = TimeXLocations.Find(p => p.Item1 == dateAndTime); + if (foundGroup != null) + return foundGroup.Item2; + else + return -1; + } + + private void DrawVerticalGridLines(int startX, int startY, int endX, int endY) + { + foreach (Tuple time in TimeXLocations) + { + Point p1 = new Point(time.Item2, startY); + Point p2 = new Point(time.Item2, endY - 1); + graphics.DrawLine(new Pen(Color.Black), p1, p2); + } + } + + private void DrawHorizontalGridLines(int endX) + { + foreach (Row row in Rows) + { + //Draw a line from the bottom of each row rect (except for the last one) + if (Rows.IndexOf(row) != Rows.Count - 1) + { + Rectangle rowRect = row.Rect; + + Point p1 = new Point(rowRect.Right, rowRect.Bottom); + Point p2 = new Point(endX, rowRect.Bottom); + graphics.DrawLine(new Pen(Color.Black), p1, p2); + } + } + } + + private Color GetContrastingTextColor(Color backgroundColor) + { + int avg = (backgroundColor.R + backgroundColor.G + backgroundColor.B) / 3; + if (avg > 255 / 2) + return Color.Black; + else + return Color.White; + } + + private void DrawRect(Rectangle rect, Color insideColor, Color borderColor, bool offsetForPen = false, bool hatch = false) + { + Brush fillBrush = new SolidBrush(insideColor); + if (hatch) + fillBrush = new HatchBrush(HatchStyle.ForwardDiagonal, Color.White, insideColor); + + Pen outlinePen = new Pen(borderColor); + + graphics.FillRectangle(fillBrush, rect); + + if (offsetForPen) + graphics.DrawRectangle(outlinePen, rect.X, rect.Y, rect.Width - outlinePen.Width, rect.Height - outlinePen.Width); + else + graphics.DrawRectangle(outlinePen, rect.X, rect.Y, rect.Width, rect.Height); + } + + private void DrawTextCenter(Rectangle rect, string text, Color? textColor = null) + { + int stringLengthPixels = (int)Math.Round(graphics.MeasureString(text, this.font).Width); + if (stringLengthPixels > rect.Width - 3) //"3" leaves room for margin on both sides + { + int convertedLength = (int)((double)(rect.Width - 5) / stringLengthPixels * text.Length); + if (convertedLength < 0) + text = ""; + else + text = text.Substring(0, convertedLength) + ".."; + } + + Point center = new Point(rect.X + rect.Width / 2, rect.Y + rect.Height / 2); + + if (textColor.HasValue) + graphics.DrawString(text, this.font, new SolidBrush(textColor.Value), center.X, center.Y, alignAllCenter); + else + graphics.DrawString(text, this.font, TextBrush, center.X, center.Y, alignAllCenter); + } + + private void DrawTextLeft(Rectangle rect, string text, Color? textColor = null) + { + int stringLengthPixels = (int)Math.Round(graphics.MeasureString(text, this.font).Width); + if (stringLengthPixels > rect.Width - 3) //"3" leaves room for margin on both sides + { + int convertedLength = (int)((double)(rect.Width - 5) / stringLengthPixels * text.Length); + if (convertedLength < 0) + text = ""; + else + text = text.Substring(0, convertedLength) + ".."; + } + + Point center = new Point(rect.X + 3, rect.Y + rect.Height / 2); + + if (textColor.HasValue) + graphics.DrawString(text, this.font, new SolidBrush(textColor.Value), center.X, center.Y, alignVertCenter); + else + graphics.DrawString(text, this.font, TextBrush, center.X, center.Y, alignVertCenter); + } + + private void RecaculateFormatDictionaries(bool overwrite = false) + { + if (overwrite) + { + DayLabelFormats.Clear(); + TimeLabelFormats.Clear(); + } + + DateTime curDay = StartDate; + while (curDay < EndDate) + { + int curHour = StartHourInDay; + while (curHour <= EndHourInDay) + { + DateTime dateWithHour = curDay.AddHours(curHour); + + if (!TimeLabelFormats.ContainsKey(dateWithHour)) + TimeLabelFormats.Add(dateWithHour, DefaultTimeLabelFormat); + + curHour++; + } + + if (!DayLabelFormats.ContainsKey(curDay)) + DayLabelFormats.Add(curDay, DefaultDayLabelFormat); + + curDay = curDay.AddDays(1); + } + } + #endregion Private Methods + + #region Public Properties + public Rectangle MainCanvas; + public SolidBrush TextBrush { get { return new SolidBrush(TextColor); } } + public Color TextColor { get; set; } + public Color HeaderBackgroundColor { get; set; } + public Color BackgroundColor { get; set; } + public DateTime StartDate { get; set; } + public DateTime EndDate { get; set; } + public int StartHourInDay { get; set; } + public int EndHourInDay { get; set; } + public List> DayXLocations { get; set; } //Format is "Date (without hour), xStartLocation, xEndLocation" + public List> TimeXLocations { get; set; } //Format is "Date (with hour), xLocation, alignment" + public Dictionary TimeLabelFormats { get; set; } + public Dictionary DayLabelFormats { get; set; } + public Dictionary Holidays { get; set; } + public List Rows { get; set; } + public int TopHeaderHeight { get; set; } + public string DefaultTimeLabelFormat { get; set; } + public string DefaultDayLabelFormat { get; set; } + public Size RowIconSize { get; set; } + public Corner RowIconLocation { get; set; } + public bool HorizontalGridLinesVisible { get; set; } + public bool VerticalGridLinesVisible { get; set; } + public bool ShowNowIndicator { get; set; } + public int NowIndicatorHourOffset { get; set; } + public int MinTimeIntervalWidth { get; set; } + #endregion Public Properties + } +} diff --git a/bin/Debug/GanttChart.dll b/bin/Debug/GanttChart.dll new file mode 100644 index 0000000000000000000000000000000000000000..e9fa3d1f1a865e498e9c0e2ddbab38aa7506573d GIT binary patch literal 38912 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 V(>hrc1w;W+Kok%KL;>$s;0M!1+u;BJ literal 0 HcmV?d00001 diff --git a/obj/Debug/DesignTimeResolveAssemblyReferences.cache b/obj/Debug/DesignTimeResolveAssemblyReferences.cache new file mode 100644 index 0000000000000000000000000000000000000000..2b41538c15581b35a6d132efdbdbfb7f06928963 GIT binary patch literal 966 zcmcIiU2oGc6m`-hOWOgHka*%Dyn$9(sY~rq%WgcVfhZ{80*!3NJcrA0IQJ0oKZKNvrOyC0fSR3di zr(jU(dek5CK2LetOU8||je$`OjWt5`l9OhxWd0JCGrfR%G*1WRuskgL{bHDkfe1S}|8ZuG=jK0l|N%kt1|oX;Dl> zZnfE2*VA=&$GW-@224!nPURN}+((Q~g=zp9Yq2ow#&^~}-kL(zLT&bZe|PjGAR7cb z^b!(~TtJ`xv5%_kp2_ptg*z4q%=7kWBh?YnF~#_Cc4G9o5mhpAX<%~y^U=YB>^+oV zpw1yVMuf^G4w!91%_fcypR`$I{LS;(@73i)evlpKIUvfpRMIYap;Q!KlhQh@XMnE6 zl~UU&on1ps73SI~IVX`lN}UpHcL=%!yADEH?r%c+tGoZ`ynV`f)pc|Mtx6YxdltT^ zg90uvLh4EkjlBfpmo;O)?|ZBrd(?(3z5VrY`7Nf4?Q}ZP4Vqo*DIcVR{v+m*8}hMD Qytz#z$5#<=Z4tXa0Y4}XFaQ7m literal 0 HcmV?d00001 diff --git a/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache new file mode 100644 index 0000000000000000000000000000000000000000..54c75e7dcf997f7cdf0493a22e7f502761aa5ecb GIT binary patch literal 6914 zcmeHMZBH9V5VpZwFoYD-ln`hVr%kIQb+2}LkHm+>#tCXdk?oR7*dpt@vDt8U>+bGh zT*PnbFR1zx+nMtlZ=qG?llb7XJYHsZ=b4?Gy?b_uL?e;N-+0k4UAIS2*zdR{g%UMw z?sDZbr>K3K3o|QRS9n{w%~Wz1q~gNc$gG%Y`lOOs-_gE=4G(-RnUhNH_*I8nKS8S` z4#C@~rWb3=wbfcCV=t%KA{!&fwND_u^0{LZ-j=69ipG1%8V!(Ufyphe;cImtC*Nm| zBbs2pR0`ax)7m`N;E`8q3P)#!SL5|OcVO0Hp3QBhp*xbaYN6&kPF^w>nnE6SyGpEz zeRt3G<%MJ8dLNRq#AF?GZ(7l>D$v_#L_OhkPe{l?jbSLZJf+dUzIScI UHrF0{ zk6&%#!6p6KSxE=isq_Umb6kR@h2)^78@6V$2uxZBJ4_#_>G}o5WJ8J?Mu=85BcaZf zmaYDTI4(>Bg>W7Xoejnrl-Ubi?}Wz>K|a1(o#U$EuoeMcoY+aUh4#c9DJ)P*$d~9n z*SIE3xy}@@3%;kh3!Nz!Ew!Vh=6nSOsDT6zP35I<(db9CbVqizL0F6tW7IGrkx`T* z(P-4bFUrWsA7jOq(%@ox;{CNWC7k&hJdoTn-(s*nWcK#18G<`vmpMM{FfKp**c)2Z zl6&=3(p8p_4zKq2*wTOAVymlc*;-!7tS>G>dTqUuy3UUq>S`Eqs0=o&H{4t_I!w_p zvZ%M4!Z3crb85gFXqcd3T$@_(UQ56>Jrcn+1xxnHSVAtFZ-hW zi$eBUMhXgtCi9RdAfYWQ;Y$n35*k94e{K}51F(Gu%CB*R&K@wS%cA4m_{*w-p4NCCtr;O_Rmm%vbTsN>1R+M3r2iSEmv{J zxQnd`)TPbE^kQZ`{ssOWnMhD*>1)iAFq_XV@Oc+DYynv{yIhj z=~^9Gdom#L$*0F_E6>WkWh6UcM522p+&wSP2fj?M_J^6-B8III;Lju2eh6S)b{Bvw zAV@U?kRJJz5a4`?I66F>9MjAsQ3TyTg9XSB!d+p2OzH9vaVp`hkRTo*1cV2XlMMGj zJ&0Nop=#klZG$%7Xx&cq$B1u_U8FmJi{ z8)3!h-7sV{Lq;>uv-_YA1i{O8A8RJA8rxU=cNpJ4Y8Uaa=dW1ropHIQF)Ub6`SO#s zl`!&t&^Ld;$G5%8_;~yYKJ~g+f|xNCbd7IN6hnBtCx~_j2;X8Omd8?Tlqh(>%g?$J zB~E@xn;?=-S0dn&*f5@=m^;Z{SsOkzo?-9I$s6uzss>V-a0|E2sqq~3^CzXN3!kl1 z<2&ph1ouy&ovD)oYZA?+!sw~-J*qY_wEy=wP~~3dIFKNgPbVD1L=ndAGJZhAdm-dO mo>|OBa-Rs!5eRZCxcQVBbdCNwe3Jd!KVpVYvR;9_GWidJkN$fA literal 0 HcmV?d00001 diff --git a/obj/Debug/GanttChart.csproj.CoreCompileInputs.cache b/obj/Debug/GanttChart.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..37b8a19 --- /dev/null +++ b/obj/Debug/GanttChart.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +e30e609b7af6420a761d9611cd8bcf490fdbd0ff diff --git a/obj/Debug/GanttChart.csproj.FileListAbsolute.txt b/obj/Debug/GanttChart.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..b4953aa --- /dev/null +++ b/obj/Debug/GanttChart.csproj.FileListAbsolute.txt @@ -0,0 +1,18 @@ +C:\Users\derek.antrican\source\repos\OpSchedule\GanttChart\bin\Debug\GanttChart.dll +C:\Users\derek.antrican\source\repos\OpSchedule\GanttChart\bin\Debug\GanttChart.pdb +C:\Users\derek.antrican\source\repos\OpSchedule\GanttChart\obj\Debug\GanttChart.csproj.CoreCompileInputs.cache +C:\Users\derek.antrican\source\repos\OpSchedule\GanttChart\obj\Debug\GanttChart.dll +C:\Users\derek.antrican\source\repos\OpSchedule\GanttChart\obj\Debug\GanttChart.pdb +C:\Users\derek\Desktop\OpSchedule\GanttChart\bin\Debug\GanttChart.dll +C:\Users\derek\Desktop\OpSchedule\GanttChart\bin\Debug\GanttChart.pdb +C:\Users\derek\Desktop\OpSchedule\GanttChart\obj\Debug\GanttChart.csprojAssemblyReference.cache +C:\Users\derek\Desktop\OpSchedule\GanttChart\obj\Debug\GanttChart.csproj.CoreCompileInputs.cache +C:\Users\derek\Desktop\OpSchedule\GanttChart\obj\Debug\GanttChart.dll +C:\Users\derek\Desktop\OpSchedule\GanttChart\obj\Debug\GanttChart.pdb +C:\Users\derek.antrican\source\repos\OpSchedule\GanttChart\obj\Debug\GanttChart.csprojAssemblyReference.cache +C:\Users\derek.antrican\Source\Repos\GanttChart\bin\Debug\GanttChart.dll +C:\Users\derek.antrican\Source\Repos\GanttChart\bin\Debug\GanttChart.pdb +C:\Users\derek.antrican\Source\Repos\GanttChart\obj\Debug\GanttChart.csprojAssemblyReference.cache +C:\Users\derek.antrican\Source\Repos\GanttChart\obj\Debug\GanttChart.csproj.CoreCompileInputs.cache +C:\Users\derek.antrican\Source\Repos\GanttChart\obj\Debug\GanttChart.dll +C:\Users\derek.antrican\Source\Repos\GanttChart\obj\Debug\GanttChart.pdb diff --git a/obj/Debug/GanttChart.csprojAssemblyReference.cache b/obj/Debug/GanttChart.csprojAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..7ce01ac3bec939be3953e4fcb3ffd8aebcdd63df GIT binary patch literal 424 zcmaJ-Jx{|h5Oru$TEb8kCWf#_R-!6`B|;)ng#-vts*a#basjJujQlZ_-^_miA5=`h z8=md+d%kyO0b}gLgI2=fo~OrK(Q0K>Z~3JYvg1oIYr`w0F-=yejZj0G7d+<~&(frF z(mIXhfX-@=X>#uxDcWn?F4Y=`vdQLs(Vz8s-W3_lA);odzxSxO#^R>7V3AbQUP$~p zjZVI=d4-KF5w#1c^oNh8jGx5w;6Jwl PgDePUWF*YUOo%@LsAYB8 literal 0 HcmV?d00001 diff --git a/obj/Debug/GanttChart.dll b/obj/Debug/GanttChart.dll new file mode 100644 index 0000000000000000000000000000000000000000..e9fa3d1f1a865e498e9c0e2ddbab38aa7506573d GIT binary patch literal 38912 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 V(>hrc1w;W+Kok%KL;>$s;0M!1+u;BJ literal 0 HcmV?d00001 diff --git a/obj/Release/GanttChart.csproj.CoreCompileInputs.cache b/obj/Release/GanttChart.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..120b5d1 --- /dev/null +++ b/obj/Release/GanttChart.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +bda50a4589809f5b8f24760b4a2f7efa328db24e diff --git a/obj/Release/GanttChart.csprojAssemblyReference.cache b/obj/Release/GanttChart.csprojAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..f30cd485f37537c32fe5bbdf7db5afdc59c3607b GIT binary patch literal 10290 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