Free cookie consent management tool by TermsFeed Policy Generator

source: stable/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ScheduleView.cs @ 11704

Last change on this file since 11704 was 11170, checked in by ascheibe, 10 years ago

#2115 updated copyright year in stable branch

File size: 14.7 KB
RevLine 
[6976]1#region License Information
2/* HeuristicLab
[11170]3 * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
[6976]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
[9016]41    public List<HiveDowntime> offlineTimes = new List<HiveDowntime>();
[6976]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) {
[9016]58      List<HiveDowntime> apps = new List<HiveDowntime>();
[6976]59
[9016]60      foreach (HiveDowntime app in offlineTimes) {
[6976]61        if (app.StartDate >= e.StartDate && app.StartDate <= e.EndDate && !app.Deleted) {
62          apps.Add(app);
63        }
64      }
65
66      e.Appointments.Clear();
[9016]67      foreach (HiveDowntime app in apps) {
[6976]68        e.Appointments.Add(app);
69      }
70    }
71
72    private void dvOnline_OnNewAppointment(object sender, NewAppointmentEventArgs e) {
[9016]73      HiveDowntime downtime = new HiveDowntime();
[6976]74
[9016]75      downtime.StartDate = e.StartDate;
76      downtime.EndDate = e.EndDate;
77      offlineTimes.Add(downtime);
[6976]78    }
79
80    private void UpdateCalendarFromContent() {
81      offlineTimes.Clear();
82      if (Content != null) {
[9016]83        foreach (Downtime downtime in Content) {
84          offlineTimes.Add(ToHiveDowntime(downtime));
[6976]85        }
86      }
87      dvOnline.Invalidate();
88    }
89
[9016]90    private bool CreateDowntime(DowntimeType dtType) {
[6976]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)
[9016]97            offlineTimes.Add(CreateDowntime(from, to.AddDays(1), true, dtType));
[6976]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)
[9016]104              offlineTimes.Add(CreateDowntime(from, to, false, dtType));
[6976]105            else {
106              //more than 1 day selected
107              while (from.Date != to.Date) {
[9016]108                offlineTimes.Add(CreateDowntime(from, new DateTime(from.Year, from.Month, from.Day, to.Hour, to.Minute, 0, 0), false, dtType));
[6976]109                from = from.AddDays(1);
110              }
[9016]111              offlineTimes.Add(CreateDowntime(from, new DateTime(from.Year, from.Month, from.Day, to.Hour, to.Minute, 0, 0), false, dtType));
[6976]112            }
113          } else
114            MessageBox.Show("Incorrect date format", "Schedule Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
115        }
116        dvOnline.Invalidate();
117        return true;
118      } else {
[9016]119        MessageBox.Show("Error creating downtime, please fill out all textboxes!", "Schedule Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
[6976]120        return false;
121      }
122    }
123
[9016]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;
[6976]134    }
135
[9016]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;
[6976]147    }
148
[9016]149    private void DeleteRecurringDowntime(Guid recurringId) {
150      foreach (HiveDowntime downtime in offlineTimes) {
151        if (downtime.RecurringId == recurringId) {
152          downtime.Deleted = true;
[6976]153        }
154      }
155    }
156
[9016]157    private void ChangeRecurrenceDowntime(Guid recurringId) {
[6976]158      int hourfrom = int.Parse(txttimeFrom.Text.Substring(0, txttimeFrom.Text.IndexOf(':')));
159      int hourTo = int.Parse(txttimeTo.Text.Substring(0, txttimeTo.Text.IndexOf(':')));
[9016]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));
[6976]163    }
164
165    public void DialogClosed(RecurrentEvent e) {
[9016]166      CreateDailyRecurrenceDowntimes(e.DateFrom, e.DateTo, e.AllDay, e.WeekDays, e.DowntimeType);
[6976]167    }
168
[9016]169    private void CreateDailyRecurrenceDowntimes(DateTime dateFrom, DateTime dateTo, bool allDay, HashSet<DayOfWeek> daysOfWeek, DowntimeType appointmentType) {
[6976]170      DateTime incDate = dateFrom;
171      Guid guid = Guid.NewGuid();
172
173      while (incDate.Date <= dateTo.Date) {
174        if (daysOfWeek.Contains(incDate.Date.DayOfWeek))
[9016]175          offlineTimes.Add(CreateDowntime(incDate, new DateTime(incDate.Year, incDate.Month, incDate.Day, dateTo.Hour, dateTo.Minute, 0), allDay, true, guid, appointmentType));
[6976]176        incDate = incDate.AddDays(1);
177      }
178
179      dvOnline.Invalidate();
180    }
181
182    private void btbDelete_Click(object sender, EventArgs e) {
[9016]183      HiveDowntime selectedDowntime = (HiveDowntime)dvOnline.SelectedAppointment;
[6976]184      if (dvOnline.SelectedAppointment != null) {
[9016]185        if (!selectedDowntime.Recurring)
186          DeleteDowntime();
[6976]187        else {
[7152]188          DialogResult res = MessageBox.Show("Delete all events in this series?", "Delete recurrences", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
[6976]189          if (res != DialogResult.Yes)
[9016]190            DeleteDowntime();
[6976]191          else
[9016]192            DeleteRecurringDowntime(selectedDowntime.RecurringId);
[6976]193        }
194      }
195      dvOnline.Invalidate();
196    }
197
[9016]198    private void DeleteDowntime() {
[6976]199      try {
[9016]200        HiveDowntime downtime = offlineTimes.First(s => s.Equals((HiveDowntime)dvOnline.SelectedAppointment));
201        downtime.Deleted = true;
[6976]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();
[8051]224    }
225
[8075]226    public virtual void SetEnabledStateOfSchedule(bool state) {
[8051]227      if (InvokeRequired) {
[8075]228        Invoke(new Action(() => SetEnabledStateOfSchedule(state)));
[7250]229      } else {
[8051]230        if (Content == null) state = false;
231        groupBox1.Enabled = state;
232        btnClearCal.Enabled = state;
233        btnSaveCal.Enabled = state;
[7250]234      }
[6976]235    }
236
237    private void btnClearCal_Click(object sender, System.EventArgs e) {
[9016]238      foreach (HiveDowntime app in offlineTimes) {
[6976]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();
[9016]255        btCreate.Text = "Create Downtime";
[6976]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
[9016]270        btCreate.Text = "Create Downtime";
[6976]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) {
[8957]280        DowntimeType dtType;
281        DialogResult result;
[9016]282        DowntimeTypeDialog dialog = new DowntimeTypeDialog();
[8957]283        result = dialog.ShowDialog(this);
284        dtType = dialog.AppointmentType;
285        dialog.Dispose();
286        if (result == DialogResult.Cancel) return;
[9016]287        CreateDowntime(dtType);
[6976]288      } else {
289        //now we want to change an existing appointment
290        if (!dvOnline.SelectedAppointment.Recurring) {
[9016]291          if (CreateDowntime(GetDowntimeTypeOfSelectedDowntime()))
292            DeleteDowntime();
[6976]293        } else {
294          //change recurring appointment
295          //check, if only selected appointment has to change or whole recurrence
[7152]296          DialogResult res = MessageBox.Show("Change all events in this series?", "Change recurrences", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
[6976]297          if (res != DialogResult.Yes) {
[9016]298            if (CreateDowntime(GetDowntimeTypeOfSelectedDowntime()))
299              DeleteDowntime();
[6976]300          } else
[9016]301            ChangeRecurrenceDowntime(((HiveDowntime)dvOnline.SelectedAppointment).RecurringId);
[6976]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) {
[9016]315        MessageBox.Show("You have to save the group before you can save the schedule. ", "HeuristicLab Hive Administrator", MessageBoxButtons.OK, MessageBoxIcon.Stop);
[6976]316      } else {
[9016]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);
[6976]324          }
325        }
[9016]326        foreach (Downtime dt in downtimes) {
[6976]327          dt.Store();
328        }
329      }
330    }
331
[9016]332    private HiveDowntime ToHiveDowntime(Downtime downtime) {
[9017]333      HiveDowntime hiveDowntime = new HiveDowntime {
[6976]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,
[8957]342        Subject = downtime.DowntimeType.ToString(),
[6976]343        Changed = downtime.Modified,
344        Id = downtime.Id
345      };
[9017]346      return hiveDowntime;
[6976]347    }
348
[9017]349    private Downtime ToDowntime(HiveDowntime hiveDowntime) {
[6976]350      Downtime downtime = new Downtime {
[9017]351        AllDayEvent = hiveDowntime.AllDayEvent,
352        EndDate = hiveDowntime.EndDate,
353        StartDate = hiveDowntime.StartDate,
354        Recurring = hiveDowntime.Recurring,
355        RecurringId = hiveDowntime.RecurringId,
[6976]356        ResourceId = HiveAdminClient.Instance.DowntimeForResourceId,
[9017]357        Id = hiveDowntime.Id,
358        DowntimeType = (DowntimeType)Enum.Parse(typeof(DowntimeType), hiveDowntime.Subject)
[6976]359      };
360      return downtime;
361    }
[8957]362
[9016]363    private DowntimeType GetDowntimeTypeOfSelectedDowntime() {
364      return (DowntimeType)Enum.Parse(typeof(DowntimeType), ((HiveDowntime)dvOnline.SelectedAppointment).Subject);
[8957]365    }
[6976]366  }
367}
Note: See TracBrowser for help on using the repository browser.