void TaskPanel_MouseMove(object sender, MouseEventArgs e) { int taskIndex = -1; IRuntimeActivity act = GetActivityAtPosition(e.X, e.Y, out taskIndex); if (act != null) { if (!act.Equals(lastActivity)) { string res = ""; foreach (string key in act.Reservations.Keys) { for (int i = 0; i < act.Reservations[key].Length; i++) { res += " " + key + "(" + (act.Reservations[key][i]) + ")\n"; } } if (res.Length == 0) { res = "no resource used"; } string str = string.Format("Activity: {0}\nStatus: {6}\n Duration: {1}\n Ellapse: {2} / Remaining: {3}\n Resource:\n{4}Task: {5}", act.Name, formatTimeScaleText(act.Duration), FormatTime(act.PlannedStart), FormatTime(act.PlannedStart + act.PlannedDuration), res, tasks[taskIndex].Name, act.Status); tooltip.SetToolTip(TaskPanel, str); lastActivity = act; } } else { tooltip.SetToolTip(TaskPanel, null); lastActivity = null; } }
void ResourcePanel_MouseMove(object sender, MouseEventArgs e) { int unit = -1; string name = null; int taskIndex = -1; IRuntimeActivity res = GetResourceActivityAtPosition(e.X, e.Y, out name, out unit, out taskIndex); if (res != null) { if (!res.Equals(lastResourceActivity)) { string t = string.Format("Resource {0}({1})\n Duration: {2}\n Ellapse: {3} / Remainning: {4}\nActivity: {5}\nTask: {6}", name, unit, formatTimeScaleText(res.Duration), FormatTime(res.PlannedStart), FormatTime(res.PlannedStart + res.PlannedDuration), res.Name, tasks[taskIndex].Name); lastResourceActivity = res; tooltip.SetToolTip(ResourcePanel, t); } } else { lastResourceActivity = null; tooltip.SetToolTip(ResourcePanel, null); } }
void PaintTaskPanel(object sender, PaintEventArgs e) { if (scheduler == null) { return; } if (tasks == null || resources == null) { return; } scheduler.Lock(); try { Graphics g = e.Graphics; Dictionary <int, IRuntimeTask> id2task = new Dictionary <int, IRuntimeTask>(); foreach (IRuntimeTask t in tasks) { id2task[t.ID] = t; } for (int i = 0; i < tasks.Length; i++) { if (!IsTaskOK(tasks[i])) { continue; } int start = 0; if (i % 2 == 1) { g.FillRectangle(backBrush, new RectangleF(e.ClipRectangle.X, TimeRowHeight + i * RowHeight, e.ClipRectangle.Width, RowHeight)); } for (int j = 0; j < tasks[i].Activities.Length; j++) { IRuntimeActivity activity = tasks[i].Activities[j]; //draw activity duration //if (j > 0 && tasks[i].Activities[j - 1].Status != Status.Cancelled) { g.FillRectangle(new SolidBrush(activity.Color), new RectangleF(start + activity.PlannedStart * ScaleFactor, TimeRowHeight + i * RowHeight, activity.PlannedDuration * ScaleFactor, RowHeight - 1)); if (activity.Status == Status.Cancelled) { g.FillRectangle(new SolidBrush(Color.FromArgb(120, Color.Black)), new RectangleF(start + activity.PlannedStart * ScaleFactor, TimeRowHeight + i * RowHeight, activity.PlannedDuration * ScaleFactor, RowHeight - 1)); } if (activity.PlannedDuration * ScaleFactor >= 2) { g.DrawString(activity.Name, SystemFonts.DefaultFont, Brushes.Black, new RectangleF(start + activity.PlannedStart * ScaleFactor, TimeRowHeight + i * RowHeight, activity.PlannedDuration * ScaleFactor, RowHeight - 1)); } } } } //draw relation for (int i = 0; i < tasks.Length; i++) { if (!IsTaskOK(tasks[i])) { continue; } foreach (IRuntimeTask pt in tasks[i].TasksRunAfterEnd) { if (!IsTaskOK(pt)) { continue; } PointF endPoint = new PointF(ScaleFactor * (tasks[i].Activities[0].PlannedStart), TimeRowHeight + RowHeight * i + RowHeight * 0.5f); int j = pt.ID - 1; PointF startPoint = new PointF(ScaleFactor * (pt.Activities[pt.Activities.Length - 1].PlannedDuration + pt.Activities[pt.Activities.Length - 1].PlannedStart), TimeRowHeight + RowHeight * j + RowHeight * 0.5f); if (endPoint.X - startPoint.X <= 3) { int w = 10; PointF point2 = new PointF(startPoint.X + w, startPoint.Y); PointF point3 = new PointF(startPoint.X + w, startPoint.Y / 2.0f + endPoint.Y / 2.0f); PointF point4 = new PointF(endPoint.X - w, startPoint.Y / 2.0f + endPoint.Y / 2.0f); PointF point5 = new PointF(endPoint.X - w, endPoint.Y); g.DrawLines(Pens.Black, new PointF[] { startPoint, point2, point3, point4, point5, endPoint }); } else { PointF point2 = new PointF(startPoint.X / 2.0f + endPoint.X / 2.0f, startPoint.Y); PointF point3 = new PointF(startPoint.X / 2.0f + endPoint.X / 2.0f, endPoint.Y); g.DrawLine(Pens.Black, startPoint, point2); g.DrawLine(Pens.Black, point2, point3); g.DrawLine(Pens.Black, point3, endPoint); } g.DrawLine(Pens.Black, endPoint, new PointF(endPoint.X - 3, endPoint.Y - 3)); g.DrawLine(Pens.Black, endPoint, new PointF(endPoint.X - 3, endPoint.Y + 3)); } foreach (IRuntimeTask pt in tasks[i].TasksRunAfterStart) { PointF endPoint = new PointF(ScaleFactor * (tasks[i].PlannedStart), TimeRowHeight + RowHeight * i + RowHeight * 0.5f); int j = pt.ID - 1; PointF startPoint = new PointF(ScaleFactor * (pt.PlannedStart), TimeRowHeight + RowHeight * j + RowHeight * 0.5f); Pen p = new Pen(Color.Black, 1); p.DashPattern = new float[] { 5f, 4f, 3f, 4f }; //p.EndCap = LineCap.ArrowAnchor; if (endPoint.X - startPoint.X <= 3) { int w = 10; PointF point2 = new PointF(startPoint.X + w, startPoint.Y); PointF point3 = new PointF(startPoint.X + w, startPoint.Y / 2.0f + endPoint.Y / 2.0f); PointF point4 = new PointF(endPoint.X - w, startPoint.Y / 2.0f + endPoint.Y / 2.0f); PointF point5 = new PointF(endPoint.X - w, endPoint.Y); g.DrawLines(p, new PointF[] { startPoint, point2, point3, point4, point5, endPoint }); } else { PointF point1 = new PointF(startPoint.X - 5, startPoint.Y); PointF point2 = new PointF(startPoint.X - 5, endPoint.Y); PointF point3 = new PointF(startPoint.X / 2.0f + endPoint.X / 2.0f, endPoint.Y); g.DrawLines(p, new PointF[] { startPoint, point1, point2, endPoint }); } g.DrawLine(Pens.Black, endPoint, new PointF(endPoint.X - 3, endPoint.Y - 3)); g.DrawLine(Pens.Black, endPoint, new PointF(endPoint.X - 3, endPoint.Y + 3)); } } //draw current Line g.DrawLine(Pens.Red, scheduler.Current * scaleFactor, 0, scheduler.Current * scaleFactor, TaskPanel.Height); } catch (Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine(ex.StackTrace); } finally { scheduler.Unlock(); } }
void PaintResourcePanel(object sender, PaintEventArgs e) { if (tasks == null || resources == null) { return; } scheduler.Lock(); try { Dictionary <int, IRuntimeTask> id2task = new Dictionary <int, IRuntimeTask>(); foreach (IRuntimeTask t in tasks) { id2task[t.ID] = t; } Graphics g = e.Graphics; int count = 0; Dictionary <string, int> resouceColumns = new Dictionary <string, int>(); Dictionary <string, IRuntimeResource> name2res = new Dictionary <string, IRuntimeResource>(); //draw resource lable for (int i = 0; i < resources.Length; i++) { name2res[resources[i].Name] = resources[i]; if (resources[i].Count == 1) { count++; resouceColumns[resources[i].Name + "_0"] = count - 1; } else { for (int j = 0; j < resources[i].Count; j++) { count++; string name = resources[i].Name + "-" + (j + 1); if (!resources[i].IsUnitEnabled(j)) { name = name + "(disabled)"; } resouceColumns[resources[i].Name + "_" + j] = count - 1; } } } for (int i = 0; i < tasks.Length; i++) { if (!IsTaskOK(tasks[i])) { continue; } for (int j = 0; j < tasks[i].Activities.Length; j++) { IRuntimeActivity activity = tasks[i].Activities[j]; foreach (string key in activity.Reservations.Keys) { IRuntimeResource r = name2res[key]; int[] units = activity.Reservations[key]; for (int m = 0; m < units.Length; m++) { string nn = key + "_" + units[m]; if (units[m] >= 0 && resouceColumns.ContainsKey(nn)) { int rc = resouceColumns[nn]; //draw activity resource reservation g.FillRectangle(new SolidBrush(r.Color), new RectangleF(activity.PlannedStart * ScaleFactor, rc * RowHeight, (activity.PlannedDuration * ScaleFactor), RowHeight - 1)); if ((activity.PlannedDuration * ScaleFactor) > 1) { g.DrawString(activity.Name, SystemFonts.DefaultFont, Brushes.Black, new RectangleF(activity.PlannedStart * ScaleFactor, rc * RowHeight, (activity.PlannedDuration * ScaleFactor), RowHeight - 1)); } } } } } } //draw current Line g.DrawLine(Pens.Red, scheduler.Current * scaleFactor, 0, scheduler.Current * scaleFactor, ResourcePanel.Height); } catch (Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine(ex.StackTrace); } finally{ scheduler.Unlock(); } }