class BBTimelineBackgroundCanvas extends BBTimelineCanvas { constructor(parentEl, el) { super(parentEl, el); const a = this; a.GraphRectangle = { X: 0, Y: 0, W: 0, H: 0 }; a.Margin = 0; a.StepHeight = 0; a.NoStep = 0; a.initialiseComponents(); } initialiseComponents() { super.initialiseComponents(); const a = this; a.ClientRectangle = { X: a.Parent.Padding.Left, Y: a.Parent.Padding.Top, W: (a.Parent.Size.W - (a.Parent.Padding.Left + a.Parent.Padding.Right)), H: (a.Parent.Size.H - (a.Parent.Padding.Top + a.Parent.Padding.Bottom)) }; a.GraphRectangle = { X: a.ClientRectangle.X, Y: a.ClientRectangle.Y, W: a.ClientRectangle.W, H: (a.ClientRectangle.H - a.calcXAxisHeight()) }; a.Margin = (a.Parent.Marker.BorderWidth * 2); a.StepHeight = a.Parent.Marker.Width + a.Margin; a.NoStep = Math.floor(a.GraphRectangle.H / a.StepHeight); a.Invalidate(); } Invalidate() { const a = this; a.Clear(); a.drawAxis(); a.drawXAxisTicks(); a.drawXAxisLabels(); if (a.Parent.Debug) a.drawRectangle(a.ClientRectangle, "red"); if (a.Parent.Debug) a.drawRectangle(a.GraphRectangle, "red"); } drawAxis() { const a = this; a.CTX.beginPath(); a.CTX.moveTo(a.GraphRectangle.X, a.GraphRectangle.Y); a.CTX.lineTo(a.GraphRectangle.X, (a.GraphRectangle.H + a.GraphRectangle.Y)); a.CTX.lineTo((a.GraphRectangle.W + a.GraphRectangle.X), (a.GraphRectangle.H + a.GraphRectangle.Y)); a.CTX.lineWidth = a.Parent.Axis.LineWidth; a.CTX.strokeStyle = a.Parent.Axis.LineColour1; a.CTX.stroke(); } drawXAxisTicks() { const a = this; let startPosX = a.GraphRectangle.X; const endPosX = (a.GraphRectangle.X + a.GraphRectangle.W); const posY = (a.GraphRectangle.Y + a.GraphRectangle.H) + a.Parent.Axis.LineWidth; let i = 0; while (true) { if (startPosX >= endPosX) { break; } a.CTX.beginPath(); a.CTX.moveTo(startPosX, posY); if ((i % a.Parent.Axis.X.NoPartPerDay) == 0) { a.CTX.lineTo(startPosX, (posY + a.Parent.Axis.X.DayLineHeight)); a.CTX.strokeStyle = a.Parent.Axis.X.DayLineColour; } else { a.CTX.lineTo(startPosX, (posY + a.Parent.Axis.X.HourLineHeight)); a.CTX.strokeStyle = a.Parent.Axis.X.HourLineColour; } a.CTX.lineWidth = a.Parent.Axis.LineWidth; a.CTX.stroke(); startPosX += a.Parent.Axis.X.HourLineSpace; i++; } } drawXAxisLabels() { const a = this; const result = a.calcXAxisPositions(); const posY = (a.GraphRectangle.Y + a.GraphRectangle.H) + a.Parent.Axis.LineWidth; result.forEach(function(e, i) { const date = a.Parent.ConvertToDate(e.Date); let writeLabel = false; if ((i == 0)) { // Don't label first entry if too close to the next month if (date.getDate() < 25) { writeLabel = true; } } else if (date.getDate() == 1) { writeLabel = true; } // if (i == 0) { // return; // } const labelSize = a.drawText(e.X, (posY + a.Parent.Axis.X.DayLineHeight), a.Parent.DateToString(date, "dd"), a.Parent.Axis.Font, a.Parent.Axis.LabelColour, "center"); // Write month on first of the month if (writeLabel) { a.drawText(e.X, (posY + a.Parent.Axis.X.DayLineHeight + labelSize.Height + a.Parent.Axis.LabelSpacing), a.Parent.DateToString(date, "MMMM yyyy"), a.Parent.Axis.Font, a.Parent.Axis.LabelColour, "left"); } }); } calcXAxisPositions() { const a = this; const endPosX = (a.GraphRectangle.X + a.GraphRectangle.W); let result = []; let x = a.GraphRectangle.X; let date = a.Parent.ConvertToDate(a.Parent.ShowDate); // Rollback one day date.setDate(date.getDate() - 1); while (true) { if (x >= endPosX) { break; } result.push({ Date: a.Parent.DateToString(date, a.Parent.DateParsePattern), X: x }); x += (a.Parent.Axis.X.HourLineSpace * a.Parent.Axis.X.NoPartPerDay); date.setDate(date.getDate() + 1); } return result; } calcXAxisHeight() { const a = this; const labelSize = a.measureText(a.Parent.Axis.Font, "0"); return labelSize.Height + a.Parent.Axis.LabelSpacing + (a.Parent.Axis.X.DayLineHeight * 2); } // OnMouseDown(sender, e, event) { // } // OnClick(sender, e, event) { // } }