source: branches/HiveProjectManagement/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ScheduleView.cs @ 15559

Last change on this file since 15559 was 14185, checked in by swagner, 5 years ago

#2526: Updated year of copyrights in license headers

File size: 14.7 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using System.Collections.Generic;
24using System.Drawing;
25using System.Linq;
26using System.Windows.Forms;
27using Calendar;
28using HeuristicLab.Core;
29using HeuristicLab.Core.Views;
30using HeuristicLab.MainForm;
31
32namespace HeuristicLab.Clients.Hive.Administrator.Views {
33  [View("Schedule View")]
34  [Content(typeof(IItemList<Downtime>), IsDefaultView = true)]
35  public partial class ScheduleView : ItemView {
36    public new IItemList<Downtime> Content {
37      get { return (IItemList<Downtime>)base.Content; }
38      set { base.Content = value; }
39    }
40
41    public List<HiveDowntime> offlineTimes = new List<HiveDowntime>();
42
43    //delegate fired, if a dialog is being closed
44    public delegate void OnDialogClosedDelegate(RecurrentEvent e);
45
46    public ScheduleView() {
47      InitializeComponent();
48      InitCalender();
49    }
50
51    private void InitCalender() {
52      dvOnline.StartDate = DateTime.Now;
53      dvOnline.OnNewAppointment += new EventHandler<NewAppointmentEventArgs>(dvOnline_OnNewAppointment);
54      dvOnline.OnResolveAppointments += new EventHandler<ResolveAppointmentsEventArgs>(dvOnline_OnResolveAppointments);
55    }
56
57    private void dvOnline_OnResolveAppointments(object sender, ResolveAppointmentsEventArgs e) {
58      List<HiveDowntime> apps = new List<HiveDowntime>();
59
60      foreach (HiveDowntime app in offlineTimes) {
61        if (app.StartDate >= e.StartDate && app.StartDate <= e.EndDate && !app.Deleted) {
62          apps.Add(app);
63        }
64      }
65
66      e.Appointments.Clear();
67      foreach (HiveDowntime app in apps) {
68        e.Appointments.Add(app);
69      }
70    }
71
72    private void dvOnline_OnNewAppointment(object sender, NewAppointmentEventArgs e) {
73      HiveDowntime downtime = new HiveDowntime();
74
75      downtime.StartDate = e.StartDate;
76      downtime.EndDate = e.EndDate;
77      offlineTimes.Add(downtime);
78    }
79
80    private void UpdateCalendarFromContent() {
81      offlineTimes.Clear();
82      if (Content != null) {
83        foreach (Downtime downtime in Content) {
84          offlineTimes.Add(ToHiveDowntime(downtime));
85        }
86      }
87      dvOnline.Invalidate();
88    }
89
90    private bool CreateDowntime(DowntimeType dtType) {
91      DateTime from, to;
92
93      if (!string.IsNullOrEmpty(dtpFrom.Text) && !string.IsNullOrEmpty(dtpTo.Text)) {
94        if (chbade.Checked) {
95          //whole day appointment, only dates are visible
96          if (DateTime.TryParse(dtpFrom.Text, out from) && DateTime.TryParse(dtpTo.Text, out to) && from <= to)
97            offlineTimes.Add(CreateDowntime(from, to.AddDays(1), true, dtType));
98          else
99            MessageBox.Show("Incorrect date format", "Schedule Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
100        } else if (!string.IsNullOrEmpty(txttimeFrom.Text) && !string.IsNullOrEmpty(txttimeTo.Text)) {
101          //Timeframe appointment
102          if (DateTime.TryParse(dtpFrom.Text + " " + txttimeFrom.Text, out from) && DateTime.TryParse(dtpTo.Text + " " + txttimeTo.Text, out to) && from < to) {
103            if (from.Date == to.Date)
104              offlineTimes.Add(CreateDowntime(from, to, false, dtType));
105            else {
106              //more than 1 day selected
107              while (from.Date != to.Date) {
108                offlineTimes.Add(CreateDowntime(from, new DateTime(from.Year, from.Month, from.Day, to.Hour, to.Minute, 0, 0), false, dtType));
109                from = from.AddDays(1);
110              }
111              offlineTimes.Add(CreateDowntime(from, new DateTime(from.Year, from.Month, from.Day, to.Hour, to.Minute, 0, 0), false, dtType));
112            }
113          } else
114            MessageBox.Show("Incorrect date format", "Schedule Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
115        }
116        dvOnline.Invalidate();
117        return true;
118      } else {
119        MessageBox.Show("Error creating downtime, please fill out all textboxes!", "Schedule Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
120        return false;
121      }
122    }
123
124    private HiveDowntime CreateDowntime(DateTime startDate, DateTime endDate, bool allDay, DowntimeType downtimeType) {
125      HiveDowntime downtime = new HiveDowntime();
126      downtime.StartDate = startDate;
127      downtime.EndDate = endDate;
128      downtime.AllDayEvent = allDay;
129      downtime.BorderColor = Color.Red;
130      downtime.Locked = true;
131      downtime.Subject = downtimeType.ToString();
132      downtime.Recurring = false;
133      return downtime;
134    }
135
136    private HiveDowntime CreateDowntime(DateTime startDate, DateTime endDate, bool allDay, bool recurring, Guid recurringId, DowntimeType downtimeType) {
137      HiveDowntime downtime = new HiveDowntime();
138      downtime.StartDate = startDate;
139      downtime.EndDate = endDate;
140      downtime.AllDayEvent = allDay;
141      downtime.BorderColor = Color.Red;
142      downtime.Locked = true;
143      downtime.Subject = downtimeType.ToString();
144      downtime.Recurring = recurring;
145      downtime.RecurringId = recurringId;
146      return downtime;
147    }
148
149    private void DeleteRecurringDowntime(Guid recurringId) {
150      foreach (HiveDowntime downtime in offlineTimes) {
151        if (downtime.RecurringId == recurringId) {
152          downtime.Deleted = true;
153        }
154      }
155    }
156
157    private void ChangeRecurrenceDowntime(Guid recurringId) {
158      int hourfrom = int.Parse(txttimeFrom.Text.Substring(0, txttimeFrom.Text.IndexOf(':')));
159      int hourTo = int.Parse(txttimeTo.Text.Substring(0, txttimeTo.Text.IndexOf(':')));
160      List<HiveDowntime> recurringDowntimes = offlineTimes.Where(appointment => ((HiveDowntime)appointment).RecurringId == recurringId).ToList();
161      recurringDowntimes.ForEach(appointment => appointment.StartDate = new DateTime(appointment.StartDate.Year, appointment.StartDate.Month, appointment.StartDate.Day, hourfrom, 0, 0));
162      recurringDowntimes.ForEach(appointment => appointment.EndDate = new DateTime(appointment.EndDate.Year, appointment.EndDate.Month, appointment.EndDate.Day, hourTo, 0, 0));
163    }
164
165    public void DialogClosed(RecurrentEvent e) {
166      CreateDailyRecurrenceDowntimes(e.DateFrom, e.DateTo, e.AllDay, e.WeekDays, e.DowntimeType);
167    }
168
169    private void CreateDailyRecurrenceDowntimes(DateTime dateFrom, DateTime dateTo, bool allDay, HashSet<DayOfWeek> daysOfWeek, DowntimeType appointmentType) {
170      DateTime incDate = dateFrom;
171      Guid guid = Guid.NewGuid();
172
173      while (incDate.Date <= dateTo.Date) {
174        if (daysOfWeek.Contains(incDate.Date.DayOfWeek))
175          offlineTimes.Add(CreateDowntime(incDate, new DateTime(incDate.Year, incDate.Month, incDate.Day, dateTo.Hour, dateTo.Minute, 0), allDay, true, guid, appointmentType));
176        incDate = incDate.AddDays(1);
177      }
178
179      dvOnline.Invalidate();
180    }
181
182    private void btbDelete_Click(object sender, EventArgs e) {
183      HiveDowntime selectedDowntime = (HiveDowntime)dvOnline.SelectedAppointment;
184      if (dvOnline.SelectedAppointment != null) {
185        if (!selectedDowntime.Recurring)
186          DeleteDowntime();
187        else {
188          DialogResult res = MessageBox.Show("Delete all events in this series?", "Delete recurrences", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
189          if (res != DialogResult.Yes)
190            DeleteDowntime();
191          else
192            DeleteRecurringDowntime(selectedDowntime.RecurringId);
193        }
194      }
195      dvOnline.Invalidate();
196    }
197
198    private void DeleteDowntime() {
199      try {
200        HiveDowntime downtime = offlineTimes.First(s => s.Equals((HiveDowntime)dvOnline.SelectedAppointment));
201        downtime.Deleted = true;
202      }
203      catch (InvalidOperationException) {
204        // this is a ui bug where a selected all day appointment is not properly selected :-/
205      }
206    }
207
208    #region Register Content Events
209    protected override void DeregisterContentEvents() {
210      base.DeregisterContentEvents();
211    }
212    protected override void RegisterContentEvents() {
213      base.RegisterContentEvents();
214    }
215    #endregion
216
217    protected override void OnContentChanged() {
218      base.OnContentChanged();
219      UpdateCalendarFromContent();
220    }
221
222    protected override void SetEnabledStateOfControls() {
223      base.SetEnabledStateOfControls();
224    }
225
226    public virtual void SetEnabledStateOfSchedule(bool state) {
227      if (InvokeRequired) {
228        Invoke(new Action(() => SetEnabledStateOfSchedule(state)));
229      } else {
230        if (Content == null) state = false;
231        groupBox1.Enabled = state;
232        btnClearCal.Enabled = state;
233        btnSaveCal.Enabled = state;
234      }
235    }
236
237    private void btnClearCal_Click(object sender, System.EventArgs e) {
238      foreach (HiveDowntime app in offlineTimes) {
239        app.Deleted = true;
240      }
241      dvOnline.Invalidate();
242    }
243
244    private void chbade_CheckedChanged(object sender, EventArgs e) {
245      txttimeFrom.Visible = !chbade.Checked;
246      txttimeTo.Visible = !chbade.Checked;
247    }
248
249    private void dvOnline_OnSelectionChanged(object sender, EventArgs e) {
250      if (dvOnline.Selection == SelectionType.DateRange) {
251        dtpFrom.Text = dvOnline.SelectionStart.ToShortDateString();
252        dtpTo.Text = dvOnline.SelectionEnd.Date.ToShortDateString();
253        txttimeFrom.Text = dvOnline.SelectionStart.ToShortTimeString();
254        txttimeTo.Text = dvOnline.SelectionEnd.ToShortTimeString();
255        btCreate.Text = "Create Downtime";
256      }
257
258      if (dvOnline.Selection == SelectionType.Appointment) {
259        dtpFrom.Text = dvOnline.SelectedAppointment.StartDate.ToShortDateString();
260        dtpTo.Text = dvOnline.SelectedAppointment.EndDate.ToShortDateString();
261        txttimeFrom.Text = dvOnline.SelectedAppointment.StartDate.ToShortTimeString();
262        txttimeTo.Text = dvOnline.SelectedAppointment.EndDate.ToShortTimeString();
263
264        if (dvOnline.SelectedAppointment.Recurring)
265          //also change the caption of the save button
266          btCreate.Text = "Save changes";
267      }
268      if (dvOnline.Selection == SelectionType.None) {
269        //also change the caption of the save button
270        btCreate.Text = "Create Downtime";
271      }
272    }
273
274    private void mcOnline_DateChanged(object sender, DateRangeEventArgs e) {
275      dvOnline.StartDate = mcOnline.SelectionStart;
276    }
277
278    private void btCreate_Click(object sender, EventArgs e) {
279      if (dvOnline.Selection != SelectionType.Appointment) {
280        DowntimeType dtType;
281        DialogResult result;
282        DowntimeTypeDialog dialog = new DowntimeTypeDialog();
283        result = dialog.ShowDialog(this);
284        dtType = dialog.AppointmentType;
285        dialog.Dispose();
286        if (result == DialogResult.Cancel) return;
287        CreateDowntime(dtType);
288      } else {
289        //now we want to change an existing appointment
290        if (!dvOnline.SelectedAppointment.Recurring) {
291          if (CreateDowntime(GetDowntimeTypeOfSelectedDowntime()))
292            DeleteDowntime();
293        } else {
294          //change recurring appointment
295          //check, if only selected appointment has to change or whole recurrence
296          DialogResult res = MessageBox.Show("Change all events in this series?", "Change recurrences", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
297          if (res != DialogResult.Yes) {
298            if (CreateDowntime(GetDowntimeTypeOfSelectedDowntime()))
299              DeleteDowntime();
300          } else
301            ChangeRecurrenceDowntime(((HiveDowntime)dvOnline.SelectedAppointment).RecurringId);
302        }
303      }
304      dvOnline.Invalidate();
305    }
306
307    private void btnRecurrence_Click(object sender, EventArgs e) {
308      Recurrence recurrence = new Recurrence();
309      recurrence.dialogClosedDelegate = new OnDialogClosedDelegate(this.DialogClosed);
310      recurrence.Show();
311    }
312
313    private void btnSaveCal_Click(object sender, EventArgs e) {
314      if (HiveAdminClient.Instance.DowntimeForResourceId == null || HiveAdminClient.Instance.DowntimeForResourceId == Guid.Empty) {
315        MessageBox.Show("You have to save the group before you can save the schedule. ", "HeuristicLab Hive Administrator", MessageBoxButtons.OK, MessageBoxIcon.Stop);
316      } else {
317        List<Downtime> downtimes = new List<Downtime>();
318        foreach (HiveDowntime downtime in offlineTimes) {
319          if (downtime.Deleted && downtime.Id != Guid.Empty) {
320            HiveAdminClient.Delete(ToDowntime(downtime));
321          } else if (downtime.Changed || downtime.Id == null || downtime.Id == Guid.Empty) {
322            Downtime dt = ToDowntime(downtime);
323            downtimes.Add(dt);
324          }
325        }
326        foreach (Downtime dt in downtimes) {
327          dt.Store();
328        }
329      }
330    }
331
332    private HiveDowntime ToHiveDowntime(Downtime downtime) {
333      HiveDowntime hiveDowntime = new HiveDowntime {
334        AllDayEvent = downtime.AllDayEvent,
335        EndDate = downtime.EndDate,
336        StartDate = downtime.StartDate,
337        Recurring = downtime.Recurring,
338        RecurringId = downtime.RecurringId,
339        Deleted = false,
340        BorderColor = Color.Red,
341        Locked = true,
342        Subject = downtime.DowntimeType.ToString(),
343        Changed = downtime.Modified,
344        Id = downtime.Id
345      };
346      return hiveDowntime;
347    }
348
349    private Downtime ToDowntime(HiveDowntime hiveDowntime) {
350      Downtime downtime = new Downtime {
351        AllDayEvent = hiveDowntime.AllDayEvent,
352        EndDate = hiveDowntime.EndDate,
353        StartDate = hiveDowntime.StartDate,
354        Recurring = hiveDowntime.Recurring,
355        RecurringId = hiveDowntime.RecurringId,
356        ResourceId = HiveAdminClient.Instance.DowntimeForResourceId,
357        Id = hiveDowntime.Id,
358        DowntimeType = (DowntimeType)Enum.Parse(typeof(DowntimeType), hiveDowntime.Subject)
359      };
360      return downtime;
361    }
362
363    private DowntimeType GetDowntimeTypeOfSelectedDowntime() {
364      return (DowntimeType)Enum.Parse(typeof(DowntimeType), ((HiveDowntime)dvOnline.SelectedAppointment).Subject);
365    }
366  }
367}
Note: See TracBrowser for help on using the repository browser.