Advertisement
Guest User

Untitled

a guest
Dec 10th, 2018
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 44.00 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Windows;
  5. using System.Windows.Controls;
  6. using System.Windows.Input;
  7. using BataviaReseveringsSysteem.Database;
  8. using Controllers;
  9. using Models;
  10. using ScreenSwitcher;
  11. using Views;
  12. using FormatException = System.FormatException;
  13.  
  14. namespace BataviaReseveringsSysteem.Reservations
  15. {
  16.     // Het scherm om boten af te schrijven bestaat (nu nog) uit meerdere BoatTypeTabItems.
  17.     // Dit zijn tabjes.
  18.     // Alles (kalender, tijdsslotgrid, knoppen) wordt op deze tabjes geschreven en niet op de tabcontrol op het reserveringsscherm
  19.     public class BoatTypeTabItem : TabItem
  20.     {
  21.         // Het grid waar alles op wordt geplaatst
  22.         public Grid Grid { get; set; }
  23.  
  24.         // De kalender
  25.         public BoatTypeTabItemCalendar BoatTypeTabItemCalendar { get; set; }
  26.  
  27.         // Het tabelletje om de tijdsslots aan te klikken
  28.         public PlannerGrid PlannerGrid { get; set; }
  29.         public List<Reservation> Reservations { get; set; }
  30.  
  31.         // Een statusdisplay van de boten
  32.         public BoatView BoatView { get; set; }
  33.         public int User { get; set; }
  34.         public List<Boat> Boats { get; set; }
  35.  
  36.         // Aangezien een BoatTypeTabItem een TabItem is waarop je alle boten van een bepaald type kan weergeven, is het handig dat het BoatType erin staat
  37.  
  38.         // Dropdown voor de tijdsduur van je afschrijving
  39.         public ComboBox ReservationDurationComboBox = new ComboBox();
  40.         public ComboBox BoatNamesComboBox = new ComboBox();
  41.  
  42.         // Dropdown voor de eerste tijdsslot (dus de start) van je afschrijving
  43.         private ComboBox _reservationStartComboBox;
  44.         private Button _okButton;
  45.  
  46.         // Je mag maximaal 2 uur lang = 8 kwartier reserveren. In deze variabele staat opgenomen hoeveel kwartieren je mag reserveren (8 dus)
  47.         private const int AmountOfAvailableQuarters = 8;
  48.  
  49.         // Als het te laat is om vandaag nog te afschrijven,
  50.         // of als het nog donker is, waardoor je geen enkele slot van overmorgen mag afschrijven,
  51.         // dan wordt dit label met de melding dat er geen slots beschikbaar zijn, zichtbaar
  52.         private Label _noSlotsAvailableLabel;
  53.         private bool _selectsDuration;
  54.  
  55.         public BoatTypeTabItem(List<Boat> boats, List<Reservation> reservations)
  56.         {
  57.             _noSlotsAvailableLabel = new Label
  58.             {
  59.                 HorizontalAlignment = HorizontalAlignment.Left,
  60.                 VerticalAlignment = VerticalAlignment.Top,
  61.                 Content = "Er zijn geen boten meer afschrijfbaar vandaag",
  62.                 Visibility = Visibility.Hidden
  63.             };
  64.  
  65.             BoatView = new BoatView();
  66.  
  67.             Reservations = reservations;
  68.  
  69.             // Maak de grid waar alles in komt
  70.             Grid = new Grid();
  71.  
  72.             // Maak de "Afschrijven"-knop
  73.             MakeRegisterBtn();
  74.  
  75.             // Vul de combobox met namen
  76.             FillComboNames(boats);
  77.  
  78.             BoatTypeTabItemCalendar = new BoatTypeTabItemCalendar();
  79.  
  80.             // Als er een andere datum wordt geselecteerd, roep dan OnCalendarClicked() aan
  81.             BoatTypeTabItemCalendar.SelectedDatesChanged += OnCalendarClicked;
  82.             Grid.Children.Add(BoatTypeTabItemCalendar);
  83.  
  84.             // Dit label staat boven de bootnaamcombobox en fungeert als een kopje
  85.             Grid.Children.Add(new Label
  86.             {
  87.                 Content = "Boot:",
  88.                 HorizontalAlignment = HorizontalAlignment.Left,
  89.                 VerticalAlignment = VerticalAlignment.Top,
  90.                 Margin = new Thickness(300, 450, 0, 0),
  91.                 FontSize = 26
  92.             });
  93.  
  94.             // Dit label staat boven de boatview en fungeert als een kopje
  95.             Grid.Children.Add(new Label
  96.             {
  97.                 Content = "Eigenschappen boot:",
  98.                 HorizontalAlignment = HorizontalAlignment.Left,
  99.                 VerticalAlignment = VerticalAlignment.Top,
  100.                 Margin = new Thickness(300, 150, 0, 0),
  101.                 FontSize = 26
  102.             });
  103.  
  104.             // De boatview is een paar regels terug al aangemaakt.
  105.             Grid.Children.Add(BoatView);
  106.  
  107.             // Dit label staat boven de reservationdurationcombobox en fungeert als een kopje
  108.             Grid.Children.Add(new Label
  109.             {
  110.                 Content = "Duur reservering:",
  111.                 HorizontalAlignment = HorizontalAlignment.Left,
  112.                 VerticalAlignment = VerticalAlignment.Top,
  113.                 Margin = new Thickness(580, 340, 0, 0),
  114.                 FontSize = 26
  115.             });
  116.  
  117.             var annulerenButton = new Button
  118.             {
  119.                 Content = "Annuleren",
  120.                 Width = 120,
  121.                 Height = 25,
  122.                 HorizontalAlignment = HorizontalAlignment.Left,
  123.                 VerticalAlignment = VerticalAlignment.Top,
  124.                 Margin = new Thickness(290, 784, 0, 0),
  125.             };
  126.  
  127.             // Als je op "Annuleren" klikt, dan ga je weer terug naar het dashboard
  128.             annulerenButton.Click += (sender, e) => Switcher.Switch(new Dashboard());
  129.             Grid.Children.Add(annulerenButton);
  130.  
  131.             PlannerGrid = new PlannerGrid();
  132.             PlannerGrid.MouseDown += OnPlannerGridClick;
  133.  
  134.             // Nu worden de plannergrid, de dropdowns, de kalender en de boatview geïnitialiseerd.
  135.             // Als je dit niet zou doen,
  136.             // dan zouden al deze dingen leeg zijn als je het reserveringsscherm net opent en nog niets hebt aangeklikt.
  137.             var sunriseAndSunsetTimes = GetSunriseAndSunsetTimes(DateTime.Now);
  138.  
  139.             // De eerste slot waar het licht is. Komt de zon op om 6.24, dan is de eerste slot van 6.30 tot 6.45
  140.             var earliestSlot = GetFirstLightSlot(sunriseAndSunsetTimes[0]);
  141.  
  142.             // De laatste slot waar het licht is. Gaat de zon onder om 20.08, dan is de laatste slot van 19.45 tot 20.00
  143.             var firstDarknessSlot = GetFirstDarknessSlot(sunriseAndSunsetTimes[1]);
  144.  
  145.             var selectedBoatString = (string)BoatNamesComboBox.SelectedValue;
  146.  
  147.             // Haal alle slots op
  148.             // 1) waarbij de geselecteerde boot (we openen het reserveringsscherm net, dus de eerste boot in de botencombobox is de geselecteerde boot) al afgeschreven is
  149.             // 2) al voorbij zijn (maar waar de zon al wel op was)
  150.             // 3) te ver in de toekomst zijn om geclaimd te kunnen worden (maar waar de zon nog niet onder is)
  151.             var now = DateTime.Now;
  152.             var claimedPastAndTooDistantSlotsForThisDayAndBoat =
  153.                 GetClaimedPastAndTooDistantSlotsForThisDayAndBoat(now, now, selectedBoatString, earliestSlot,
  154.                     firstDarknessSlot);
  155.  
  156.             // Weergeef de eigenschappen van de geselecteerde boot (wederom de eerste in de botencombobox)
  157.             BoatView.UpdateView(new BoatController().GetBoatWithName(selectedBoatString));
  158.  
  159.             // Vul de PlannerGrid met de slots voor deze dag.
  160.             // Alles vòòr de eerste en na de laatste slot wordt donkerblauw.
  161.             // Alle slots die al geclaimd zijn, voorbij zijn of nog niet gereserveerd mogen worden, worden grijs
  162.             PlannerGrid.Populate(earliestSlot, firstDarknessSlot, claimedPastAndTooDistantSlotsForThisDayAndBoat);
  163.             Grid.Children.Add(PlannerGrid);
  164.  
  165.             // Staat boven de reservationstartcombobox. Fungeert als kopje.
  166.             Grid.Children.Add(new Label
  167.             {
  168.                 Content = "Starttijd:",
  169.                 HorizontalAlignment = HorizontalAlignment.Left,
  170.                 VerticalAlignment = VerticalAlignment.Top,
  171.                 Margin = new Thickness(300, 340, 0, 0),
  172.                 FontSize = 26
  173.             });
  174.             _reservationStartComboBox = new ComboBox
  175.             {
  176.                 HorizontalAlignment = HorizontalAlignment.Left,
  177.                 VerticalAlignment = VerticalAlignment.Top,
  178.                 Width = 245,
  179.                 Margin = new Thickness(310, 380, 0, 0),
  180.                 SelectedIndex = 0,
  181.                 FontSize = 26
  182.  
  183.             };
  184.  
  185.             // DropDownClosed wordt getriggerd bij inklappen van de grid.
  186.             _reservationStartComboBox.DropDownClosed += OnStartComboBoxClick;
  187.  
  188.             // Vul de reservationstartcombobox met de beschikbare starttijden voor een afschrijving.
  189.             // Om een starttijd te mogen kiezen, moet de slot van de starttijd aan de volgende voorwaarden voldoen:
  190.             // 1) Het slot moet na zonsopgang zijn
  191.             // 2) Het slot moet vòòr zonsondergang zijn
  192.             // 3) Het slot is nog niet afgeschreven
  193.             // 4) Het slot begint niet in het verleden
  194.             PopulateStartTimeComboBox(DateTime.Now, earliestSlot, firstDarknessSlot, claimedPastAndTooDistantSlotsForThisDayAndBoat);
  195.             Grid.Children.Add(_reservationStartComboBox);
  196.  
  197.             // Weergeef de grid
  198.             Content = Grid;
  199.  
  200.             FillComboTimes();
  201.  
  202.             // Kijk of je wel acht kwartier mag afschrijven of dat er afschrijving binnen die acht kwartier geclaimd is.
  203.             OnStartComboBoxClick(null, null);
  204.  
  205.             ReservationDurationComboBox.DropDownClosed += OnDurationComboBoxClick;
  206.  
  207.             Grid.Children.Add(_noSlotsAvailableLabel);
  208.         }
  209.  
  210.         // Vul de bootnaamcombobox
  211.         public void FillComboNames(List<Boat> boats)
  212.         {
  213.             BoatNamesComboBox.Name = "ComboBoatName";
  214.             BoatNamesComboBox.Width = 120;
  215.             BoatNamesComboBox.Height = 25;
  216.             BoatNamesComboBox.HorizontalAlignment = HorizontalAlignment.Left;
  217.             BoatNamesComboBox.Margin = new Thickness(10, 0, 0, 0);
  218.             // De combobox selecteert bij openen van het scherm de eerste boot
  219.             BoatNamesComboBox.SelectedIndex = 0;
  220.             BoatNamesComboBox.DropDownClosed += OnBoatNamesComboBoxClicked;
  221.             Grid.Children.Add(BoatNamesComboBox);
  222.             // Vul de combobox met boten uit de database die corresponderen met dit type
  223.             //            using (var context = new DataBase())
  224.             foreach (var item in boats)
  225.                 BoatNamesComboBox.Items.Add(item.Name);
  226.         }
  227.  
  228.         // Initialiseer de afschrijvingsduur-combobox met acht opties (één tot acht kwartier na de starttijd)
  229.         public void FillComboTimes()
  230.         {
  231.             ReservationDurationComboBox.Name = "ComboTimes";
  232.             ReservationDurationComboBox.Width = 120;
  233.             ReservationDurationComboBox.Height = 25;
  234.             ReservationDurationComboBox.Width = 245;
  235.             ReservationDurationComboBox.Height = 45;
  236.             ReservationDurationComboBox.FontSize = 26;
  237.             ReservationDurationComboBox.HorizontalAlignment = HorizontalAlignment.Left;
  238.             ReservationDurationComboBox.Margin = new Thickness(600, 37, 0, 0);
  239.             ReservationDurationComboBox.SelectedIndex = 0;
  240.             ReservationDurationComboBox.Items.Add("00:15");
  241.             ReservationDurationComboBox.Items.Add("00:30");
  242.             ReservationDurationComboBox.Items.Add("00:45");
  243.             ReservationDurationComboBox.Items.Add("01:00");
  244.             ReservationDurationComboBox.Items.Add("01:15");
  245.             ReservationDurationComboBox.Items.Add("01:30");
  246.             ReservationDurationComboBox.Items.Add("01:45");
  247.             ReservationDurationComboBox.Items.Add("02:00");
  248.             Grid.Children.Add(ReservationDurationComboBox);
  249.         }
  250.  
  251.         // De methode wanneer je een tijdsduur voor afschrijving kiest
  252.         private void OnDurationComboBoxClick(object sender, EventArgs e)
  253.         {
  254.             // Als er op de afschrijvingslengte-combobox wordt geklikt, dan wordt de plannergrid opnieuw gerenderd.
  255.  
  256.             // Genereer de eerste en de laatste slots die je mag afschrijven,
  257.             var selectedDate = BoatTypeTabItemCalendar.SelectedDate;
  258.             if (!selectedDate.HasValue) return;
  259.             var selectedDateValue = selectedDate.Value;
  260.             var sunriseAndSunsetTimes = GetSunriseAndSunsetTimes(selectedDateValue);
  261.             var earliestSlot = GetFirstLightSlot(sunriseAndSunsetTimes[0]);
  262.  
  263.             var firstDarknessSlot = GetFirstDarknessSlot(sunriseAndSunsetTimes[1]);
  264.  
  265.             // Genereer de slots die al voorbij zijn, te ver weg zijn of al geclaimd zijn
  266.             var claimedPastAndTooDistantSlotsForThisDayAndBoat =
  267.                 GetClaimedPastAndTooDistantSlotsForThisDayAndBoat(DateTime.Now, selectedDateValue,
  268.                     (string)BoatNamesComboBox.SelectedValue, earliestSlot, firstDarknessSlot);
  269.  
  270.             // Genereer de slots die je wil claimen
  271.             // (wordt bekeken aan de hand van de start- en de afschrijvingsduur-comboboxes
  272.             //            var amountOfClaimableSlots = GetAmountOfClaimableSlots(claimedPastAndTooDistantSlotsForThisDayAndBoat, firstDarknessSlot); // TODO: uitzoeken of dit nog nodig is
  273.             var amountOfSlotsWantingToBeClaimed = GetAmountOfSlotsWantingToBeClaimed();
  274.             //            var amountOfSlotsToBeClaimed = new[] { amountOfClaimableSlots, amountOfSlotsWantingToBeClaimed }.Min(); // TODO: uitzoeken of dit nog nodig is
  275.             //            var aboutToBeClaimedSlots = GetAboutToBeClaimedSlots(selectedDateValue, amountOfSlotsToBeClaimed);
  276.             var aboutToBeClaimedSlots = GetAboutToBeClaimedSlots(selectedDateValue, amountOfSlotsWantingToBeClaimed);
  277.  
  278.             // PlannerGrid opnieuw renderen
  279.             PlannerGrid.Populate(earliestSlot, firstDarknessSlot, claimedPastAndTooDistantSlotsForThisDayAndBoat, aboutToBeClaimedSlots);
  280.         }
  281.  
  282.         // De methode voor wanneer je een starttijd kiest
  283.         private void OnStartComboBoxClick(object sender, EventArgs eventArgs)
  284.         {
  285.             // Als de startcombobox wordt gesloten, refresh dan de afschrijvingslengte-combobox en de plannergrid
  286.  
  287.             // Genereer de eerste en de laatste slots die je mag afschrijven,
  288.             var selectedDate = BoatTypeTabItemCalendar.SelectedDate;
  289.             if (!selectedDate.HasValue) return;
  290.             var selectedDateValue = selectedDate.Value;
  291.             var sunriseAndSunsetTimes = GetSunriseAndSunsetTimes(selectedDateValue);
  292.             var earliestSlot = GetFirstLightSlot(sunriseAndSunsetTimes[0]);
  293.  
  294.             var firstDarknessSlot = GetFirstDarknessSlot(sunriseAndSunsetTimes[1]);
  295.  
  296.             // Genereer de slots die al voorbij zijn, te ver weg zijn of al geclaimd zijn
  297.             var claimedPastAndTooDistantSlotsForThisDayAndBoat =
  298.                 GetClaimedPastAndTooDistantSlotsForThisDayAndBoat(DateTime.Now, selectedDateValue,
  299.                     (string)BoatNamesComboBox.SelectedValue, earliestSlot, firstDarknessSlot);
  300.  
  301.             // De afschrijvingsduur-combobox moet worden ververst.
  302.             // Als er om 13 uur een reservering staat en je hebt eerst 11 uur aangeklikt als start en nu 12 uur,
  303.             // dan mag je ineens 1 uur minder reserveren.
  304.             // Hier wordt dat doorgevoerd
  305.             var amountOfClaimableSlots = GetAmountOfClaimableSlots(claimedPastAndTooDistantSlotsForThisDayAndBoat, firstDarknessSlot);
  306.             PopulateDurationTimeComboBox(amountOfClaimableSlots);
  307.  
  308.             // Zojuist is het aantal geselecteerde slots misschien gewijzigd.
  309.             // Daarom is het belangrijk dat eerst de afschrijvingslengte-combobox wordt bijgewerkt
  310.             // en dan pas gekeken welke slots er geclaimd worden
  311.             var amountOfSlotsWantingToBeClaimed = GetAmountOfSlotsWantingToBeClaimed();
  312.             //            var amountOfSlotsToBeClaimed = new[] { amountOfClaimableSlots, amountOfSlotsWantingToBeClaimed }.Min();
  313.             var aboutToBeClaimedSlots = GetAboutToBeClaimedSlots(selectedDateValue, amountOfSlotsWantingToBeClaimed);
  314.             //            var aboutToBeClaimedSlots = GetAboutToBeClaimedSlots(selectedDateValue, amountOfSlotsToBeClaimed);
  315.  
  316.             PlannerGrid.Populate(earliestSlot, firstDarknessSlot, claimedPastAndTooDistantSlotsForThisDayAndBoat, aboutToBeClaimedSlots);
  317.         }
  318.  
  319.         // Verkrijg het aantal slots dat de gebruiker heeft geselecteerd
  320.         private int GetAmountOfSlotsWantingToBeClaimed()
  321.         {
  322.             DateTime startSlot;
  323.             try
  324.             {
  325.                 // Als er op deze dag niets afgeschreven mag worden, zijn de startcombobox en de duurcombobox blanco.
  326.                 // Ze kunnen dan niet uitgelezen worden
  327.                 startSlot = DateTime.Parse(_reservationStartComboBox.SelectedValue.ToString());
  328.                 DateTime.Parse(ReservationDurationComboBox.SelectedValue.ToString());
  329.             }
  330.             catch (FormatException)
  331.             {
  332.                 // Als er niets afgeschreven mag worden, dan is het aantal slots dat de gebruiker heeft geselecteerd 0.
  333.                 // Er staat dan ook geen groen hokje in de plannergrid
  334.                 return 0;
  335.             }
  336.             // Als er wel wat afgeschreven mag worden, dan is het aantal slots de eindslot min de startslot
  337.  
  338.             // Verkrijg de duur van de slot op basis van de beginslot en de duurcombobox
  339.             var endSlot = GenerateEndTime(startSlot);
  340.  
  341.             var startSlotDayQuarter = DateTimeToDayQuarter(startSlot);
  342.             var endSlotDayQuarter = DateTimeToDayQuarter(endSlot);
  343.             return endSlotDayQuarter - startSlotDayQuarter;
  344.         }
  345.  
  346.         // Kijk hoeveel slots er zitten tussen het geselecteerde slot en de eerstvolgende afgeschreven slot of de eerste slot die te ver in de toekomst komt
  347.         private int GetAmountOfClaimableSlots(IEnumerable<DateTime> claimedPastAndTooDistantSlotsForThisDayAndBoat,
  348.             DateTime firstDarknessSlot)
  349.         {
  350.             int startSlotDayQuarter;
  351.             try
  352.             {
  353.                 // Als er op deze dag niets afgeschreven mag worden, is de startcombobox.
  354.                 // Hij kan dan niet uitgelezen worden
  355.                 startSlotDayQuarter = DateTimeToDayQuarter(DateTime.Parse(_reservationStartComboBox.SelectedValue.ToString()));
  356.             }
  357.             catch (FormatException)
  358.             {
  359.                 // Als er niets afgeschreven mag worden, dan is het aantal slots dat de gebruiker mag afschrijven altijd 0.
  360.                 return 0;
  361.             }
  362.             // Zo nee, dan wordt er gescand naar de eerstvolgende afgeschreven slot of de eerste slot die te ver in de toekomst komt
  363.  
  364.             // Laatst claimbare slot wordt eerst op de laatste slot voor zonsopgang gezet.
  365.             // Geen grijze slots vandaag? Dan is de laatst claimbare slot de laatste slot voor zonsopgang
  366.             var endSlotDayQuarter = DateTimeToDayQuarter(firstDarknessSlot);
  367.  
  368.             // Ga alle grijze slots langs
  369.             foreach (var claimedPastOrTooDistantSlotForThisDayAndBoat in claimedPastAndTooDistantSlotsForThisDayAndBoat)
  370.             {
  371.                 var claimedPastOrTooDistantSlotForThisDayAndBoatDayQuarter =
  372.                     DateTimeToDayQuarter(claimedPastOrTooDistantSlotForThisDayAndBoat);
  373.                 if (claimedPastOrTooDistantSlotForThisDayAndBoatDayQuarter < startSlotDayQuarter) continue;
  374.                 // Grijs slot gevonden? Dan wordt dat de laatst mogelijke slot
  375.                 endSlotDayQuarter = claimedPastOrTooDistantSlotForThisDayAndBoatDayQuarter;
  376.                 break;
  377.             }
  378.             // Retourneer de hoeveelheid tijd
  379.             return endSlotDayQuarter - startSlotDayQuarter;
  380.         }
  381.  
  382.         // Vul de afschrijvingsduur-combobox
  383.         private void PopulateDurationTimeComboBox(int amountOfSlotsToNextUnclaimableSlot)
  384.         {
  385.             var itemsInComboBox = ReservationDurationComboBox.Items;
  386.             // Verkrijg het item dat nu geselecteerd is
  387.             var oldSelectedIndex = ReservationDurationComboBox.SelectedIndex;
  388.             if (oldSelectedIndex < 0) oldSelectedIndex = 0;
  389.             itemsInComboBox.Clear();
  390.             // Aantal claimbare slots is het aantal slots tot het volgende onclaimbare slot met een maximum van 8
  391.             var amountOfDurationTimeStrings =
  392.                 new[] { amountOfSlotsToNextUnclaimableSlot, AmountOfAvailableQuarters }.Min();
  393.             // Vul de combobox met afschrijvingsduur-strings
  394.             GenerateClaimableDurationStrings(amountOfDurationTimeStrings).ForEach(claimableDurationString =>
  395.                 itemsInComboBox.Add(claimableDurationString));
  396.             var amountOfItems = itemsInComboBox.Count;
  397.             // Als de dag helemaal vol zit, dan is het aantal duurstrings 0
  398.             if (amountOfItems == 0)
  399.             {
  400.                 ReservationDurationComboBox.SelectedValue = "(geen slots meer reserveerbaar vandaag)";
  401.             }
  402.             else
  403.             {
  404.                 // Zo nee, stel dan de geselecteerde index opnieuw in.
  405.                 // Het wordt de vorige geselecteerde index,
  406.                 // tenzij de vorige geselecteerde index te hoog is
  407.                 // omdat de bijbehorende string niet meer in de combobox zit
  408.                 var highestSelectableIndex = amountOfItems - 1;
  409.                 ReservationDurationComboBox.SelectedIndex = new[] { oldSelectedIndex, highestSelectableIndex }.Min();
  410.             }
  411.         }
  412.  
  413.         // Maak de strings voor de afschrijvings-tijdsduur
  414.         private List<string> GenerateClaimableDurationStrings(int amountOfSlotsToBeClaimed)
  415.         {
  416.             var claimableDurationStrings = new List<string>();
  417.             for (var i = 1; i <= amountOfSlotsToBeClaimed; i++)
  418.             {
  419.                 // Bij bijvoorbeeld amountOfSlotsToBeClaimed = 2 maak je 00:15 en 00:30
  420.                 var slotString = $"0{i / 4}:{i % 4 * 15}";
  421.                 // Bij 01:0 en 02:0 moet je nog een 0 toevoegen zodat je 01:00 en 02:00 krijgt
  422.                 if (i % 4 == 0) slotString += "0";
  423.                 claimableDurationStrings.Add(slotString);
  424.             }
  425.             return claimableDurationStrings;
  426.         }
  427.  
  428.         // Maak de groene slots op basis van het aantal slots dat je wil claimen
  429.         private List<DateTime> GetAboutToBeClaimedSlots(DateTime displayedDate, int amountOfSlotsToBeClaimed)
  430.         {
  431.             DateTime startSlot;
  432.             try
  433.             {
  434.                 // Als de starttijd niet kan worden gelezen...
  435.                 startSlot = DateTime.Parse(_reservationStartComboBox.SelectedValue.ToString());
  436.             }
  437.             catch (FormatException)
  438.             {
  439.                 // dan betekent dat dat de dag geen vrije slots meer bevat.
  440.                 // Het aantal slots dat geclaimd moet worden is dus 0.
  441.                 // De lijst met slots is dus leeg.
  442.                 return new List<DateTime>();
  443.             }
  444.             var aboutToBeClaimedSlots = new List<DateTime>();
  445.             var startSlotDayQuarter = DateTimeToDayQuarter(startSlot);
  446.             var endSlotDayQuarter = startSlotDayQuarter + amountOfSlotsToBeClaimed;
  447.  
  448.             // Maak slots vanaf de startslot tot de eindslot
  449.             for (var i = startSlotDayQuarter; i < endSlotDayQuarter; i++)
  450.                 aboutToBeClaimedSlots.Add(DayQuarterToDateTime(displayedDate, i));
  451.  
  452.             // en retourneer ze
  453.             return aboutToBeClaimedSlots;
  454.         }
  455.  
  456.         // Vul de afschrijvingsstartcombobox
  457.         private void PopulateStartTimeComboBox(DateTime selectedDate, DateTime earliestSlot, DateTime firstDarknessSlot,
  458.             List<DateTime> claimedSlotsForThisDay)
  459.         {
  460.             _reservationStartComboBox.Items.Clear();
  461.             // Maak claimbare startslots op basis van de geselecteerde datum.
  462.             // Zorg er daarbij voor dat alles vóór en na het donker en de geclaimde slots niet geselecteerd kunnen worden:
  463.             // deze startslots worden ook niet gemaakt
  464.             GenerateClaimableStartSlots(selectedDate, earliestSlot, firstDarknessSlot, claimedSlotsForThisDay)
  465.                 .ForEach(claimableStartSlot => _reservationStartComboBox.Items.Add(claimableStartSlot.ToString("t")));
  466.             // Als er niets in zit,
  467.             if (_reservationStartComboBox.Items.Count == 0)
  468.             {
  469.                 // dan is de hele dag dus al gevuld.
  470.                 _reservationStartComboBox.SelectedValue = "(geen slots beschikbaar)";
  471.                 _noSlotsAvailableLabel.Visibility = Visibility.Visible;
  472.                 _okButton.IsEnabled = false;
  473.             }
  474.             else
  475.             {
  476.                 _reservationStartComboBox.SelectedIndex = 0;
  477.                 _noSlotsAvailableLabel.Visibility = Visibility.Hidden;
  478.                 _okButton.IsEnabled = true;
  479.             }
  480.         }
  481.  
  482.         // Maak de startslots
  483.         // Zorg er daarbij voor dat alles vóór en na het donker en de geclaimde slots niet geselecteerd kunnen worden:
  484.         private List<DateTime> GenerateClaimableStartSlots(DateTime selectedDate,
  485.             DateTime earliestSlot,
  486.             DateTime firstDarknessSlot,
  487.             List<DateTime> unavailableSlots)
  488.         {
  489.             var claimableSlots = new List<DateTime>();
  490.             var earliestSlotDayQuarter = DateTimeToDayQuarter(earliestSlot);
  491.             var firstDarknessSlotDayQuarter = DateTimeToDayQuarter(firstDarknessSlot);
  492.             // Maak een lijst startslots
  493.             // die begint bij zonsopgang,
  494.             // eindigt bij zonsondergang en
  495.             // geen slots bevat die al gereserveerd zijn
  496.             for (var i = earliestSlotDayQuarter; i < firstDarknessSlotDayQuarter; i++)
  497.                 if (!unavailableSlots.Exists(unavailableSlot => DateTimeToDayQuarter(unavailableSlot) == i))
  498.                     claimableSlots.Add(DayQuarterToDateTime(selectedDate, i));
  499.             return claimableSlots;
  500.         }
  501.  
  502.         // Verkrijg de eerste slot waar het gedurende de hele slot licht is
  503.         public DateTime GetFirstLightSlot(DateTime sunrise) => TopRoundTimeToSlot(sunrise);
  504.  
  505.         // Rond een tijdstip naar boven af op kwartieren
  506.         private DateTime TopRoundTimeToSlot(DateTime time) => time.AddMinutes(15 - time.Minute % 15);
  507.  
  508.         // Verkrijg de laatste slot waar het gedurende de hele slot licht is
  509.         public DateTime GetFirstDarknessSlot(DateTime sunset) => BottomRoundTimeToSlot(sunset);
  510.  
  511.         // Rond een tijdstip naar beneden af op kwartieren
  512.         private DateTime BottomRoundTimeToSlot(DateTime time) => time.AddMinutes(-(time.Minute % 15));
  513.  
  514.         // Maak de registreerknop. Standaard staat ie op onklikbaar
  515.         public void MakeRegisterBtn()
  516.         {
  517.             _okButton = new Button { Name = "okBtn", Content = "Afschrijven", Width = 120, Height = 25, IsEnabled = false };
  518.             _okButton.Click += OkBtn_Click;
  519.             _okButton.HorizontalAlignment = HorizontalAlignment.Left;
  520.             _okButton.Margin = new Thickness(150, 120, 0, 0);
  521.             Grid.Children.Add(_okButton);
  522.  
  523.         }
  524.  
  525.         // Tel de tijdsduur bij de starttijd op en genereer zo de eindtijd
  526.         public DateTime GenerateEndTime(DateTime startTime) => startTime
  527.             .AddHours(int.Parse(ReservationDurationComboBox.SelectedValue.ToString()[1].ToString()))
  528.             .AddMinutes(int.Parse(ReservationDurationComboBox.SelectedValue.ToString().Substring(3)));
  529.  
  530.         // Zodra de OkBtn is aangeklikt zal de boot worden afgeschreven na messagebox dialoog bevestiging
  531.         private void OkBtn_Click(object sender, RoutedEventArgs e)
  532.         {
  533.             // Toon een popup.
  534.             // Als de gebruiker de afschrijving toch niet definitief wil maken, dan gaan we weer naar het afschrijvenscherm
  535.             if (MessageBox.Show("Wilt u uw afschrijving definitief maken?",
  536.                     "Afschrijving bevestigen",
  537.                     MessageBoxButton.YesNo,
  538.                     MessageBoxImage.Question) !=
  539.                 MessageBoxResult.Yes)
  540.                 return;
  541.  
  542.             // Zo nee, dan gaan we de afschrijving in de database zetten
  543.             using (var context = new DataBase())
  544.             {
  545.                 // Pak de boot die je wil afschrijven
  546.                 var boat = (from db in context.Boats
  547.                             where db.Name.Equals((string)BoatNamesComboBox.SelectedValue)
  548.                             select db).First();
  549.                 // Pak de start- en eindtijd
  550.                 var startTime = DateTime.Parse(_reservationStartComboBox.SelectedValue.ToString());
  551.                 var endTime = GenerateEndTime(startTime);
  552.  
  553.                 // Maak een reservering met de geselecteerde boot, de ingelogde gebruiker, de start- en de eindtijd
  554.                 context.Reservations.Add(new Reservation(boat, startTime, endTime));
  555.                 context.SaveChanges();
  556.             }
  557.             MessageBox.Show("De boot is succesvol afgeschreven",
  558.                 "Melding",
  559.                 MessageBoxButton.OK,
  560.                 MessageBoxImage.Information);
  561.             Switcher.Switch(new Dashboard());
  562.         }
  563.  
  564.         // Als er op de combobox voor de bootnamen wordt geklikt...
  565.         private void OnBoatNamesComboBoxClicked(object sender, EventArgs e)
  566.         {
  567.             // Ververs de plannergrid, de afschrijvingsstart-combobox en de -duurcombobox
  568.             FullRefresh();
  569.  
  570.             // Werk de boatview bij met data uit deze boot
  571.             var selectedBoatString = (string)BoatNamesComboBox.SelectedValue;
  572.             var selectedBoat = new BoatController().GetBoatWithName(selectedBoatString);
  573.             BoatView.UpdateView(selectedBoat);
  574.         }
  575.  
  576.         // Verkrijg de zonsopgangs- en zonsondergangstijden voor een geselecteerde datum
  577.         // De applicatie gaat er vanuit dat de roeivereniging zich in hartje Zwolle bevindt
  578.         // Retourneert een array met twee elementen: de datum voor zonsopgang en zonsondergang
  579.         public DateTime[] GetSunriseAndSunsetTimes(DateTime selectedDate)
  580.         {
  581.             // Maak twee booleans en twee DateTime-objecten aan. De inhoud van deze objecten maakt nog niet uit.
  582.             var isSunrise = false;
  583.             var isSunset = false;
  584.             var sunrise = DateTime.Now;
  585.             var sunset = DateTime.Now;
  586.  
  587.             // De methode SunTimes.Instance.CalculateSunRiseSetTimes vormt deze objecten nu om.
  588.             // Met de booleans doen we niets, ze worden alleen gebruikt omdat dat nodig is voor de methode
  589.             SunTimes.Instance.CalculateSunRiseSetTimes(
  590.                 // Breedtegraad voor Zwolle
  591.                 new SunTimes.LatitudeCoords(
  592.                     52,
  593.                     31,
  594.                     0,
  595.                     SunTimes.LatitudeCoords.Direction.North),
  596.                 // Lengtegraad voor Zwolle
  597.                 new SunTimes.LongitudeCoords(
  598.                     6,
  599.                     4,
  600.                     58,
  601.                     SunTimes.LongitudeCoords.Direction.East),
  602.                 selectedDate,
  603.                 ref sunrise,
  604.                 ref sunset,
  605.                 ref isSunrise,
  606.                 ref isSunset
  607.                 );
  608.  
  609.             // sunrise bevat nu de tijd van zonsopgang.
  610.             // sunset bevat nu de tijd van zonsondergang.
  611.  
  612.             // Retourneer een array met sunrise en sunset
  613.             return new[] { sunrise, sunset };
  614.         }
  615.  
  616.         // Als er op de kalender wordt geklikt, verversen we de afschrijvingsstart-combobox, de -duurcombobox en de plannergrid
  617.         private void OnCalendarClicked(object sender, SelectionChangedEventArgs selectionChangedEventArgs) => FullRefresh();
  618.  
  619.         // Ververs de afschrijvingsstart-combobox, de -duurcombobox en de plannergrid
  620.         private void FullRefresh()
  621.         {
  622.             // Eerst ververs je de starttijd.
  623.             // Als je van datum verandert, kan de starttijd namelijk veranderen.
  624.             // De duurcombobox moet weten of de startcombobox veranderd is, maar andersom maakt niet uit.
  625.             // Dan wordt de duurcombobox aangepast.
  626.             // Als de duur wordt veranderd, dan moet de plannergrid dat weten.
  627.             // Daarom wordt dán pas de plannergrid bijgewerkt
  628.             var selectedDate = BoatTypeTabItemCalendar.SelectedDate;
  629.             if (!selectedDate.HasValue) return;
  630.  
  631.             // Pak de DateTime uit de DateTime? van de kalender
  632.             var selectedDateValue = selectedDate.Value;
  633.  
  634.             // Ververs de afschrijvingsstart-combobox.
  635.             var sunriseAndSunsetTimes = GetSunriseAndSunsetTimes(selectedDateValue);
  636.             var earliestSlot = GetFirstLightSlot(sunriseAndSunsetTimes[0]);
  637.  
  638.             var firstDarknessSlot = GetFirstDarknessSlot(sunriseAndSunsetTimes[1]);
  639.  
  640.             var selectedBoat = (string)BoatNamesComboBox.SelectedValue;
  641.             var claimedSlotsForThisDayAndBoat =
  642.                 GetClaimedPastAndTooDistantSlotsForThisDayAndBoat(DateTime.Now, selectedDateValue, selectedBoat,
  643.                     earliestSlot, firstDarknessSlot);
  644.  
  645.             PopulateStartTimeComboBox(selectedDateValue, earliestSlot, firstDarknessSlot, claimedSlotsForThisDayAndBoat);
  646.  
  647.             // Ververs de afschrijvingsduur-combobox
  648.             var amountOfClaimableSlots = GetAmountOfClaimableSlots(claimedSlotsForThisDayAndBoat, firstDarknessSlot);
  649.  
  650.             PopulateDurationTimeComboBox(amountOfClaimableSlots);
  651.  
  652.             // Ververs de plannergrid
  653.             var amountOfSlotsWantingToBeClaimed = GetAmountOfSlotsWantingToBeClaimed();
  654.             var amountOfSlotsToBeClaimed =
  655.                 GetAmountOfSlotsToBeClaimed(amountOfClaimableSlots, amountOfSlotsWantingToBeClaimed);
  656.             var aboutToBeClaimedSlots = GetAboutToBeClaimedSlots(selectedDateValue, amountOfSlotsToBeClaimed);
  657.  
  658.             PlannerGrid.Populate(earliestSlot, firstDarknessSlot, claimedSlotsForThisDayAndBoat, aboutToBeClaimedSlots);
  659.         }
  660.  
  661.         // Pak het aantal plannerslots dat geclaimd moet worden.
  662.         // Dit is het aantal slots dat geclaimd wil worden volgens de afschrijvingsduur-combobox,
  663.         // maar het mag niet meer zijn dan het aantal slots dat geclaimd mag worden
  664.         private int GetAmountOfSlotsToBeClaimed(int amountOfClaimableSlots, int amountOfSlotsWantingToBeClaimed) =>
  665.             new[] { amountOfClaimableSlots, amountOfSlotsWantingToBeClaimed }.Min();
  666.  
  667.         // Verkrijg de slots die
  668.         // 1) waarbij de geselecteerde boot (we openen het reserveringsscherm net, dus de eerste boot in de botencombobox is de geselecteerde boot) al afgeschreven is
  669.         // 2) al voorbij zijn (maar waar de zon al wel op was)
  670.         // 3) te ver in de toekomst zijn om geclaimd te kunnen worden (maar waar de zon nog niet onder is)
  671.         public List<DateTime> GetClaimedPastAndTooDistantSlotsForThisDayAndBoat(DateTime now, DateTime selectedDate, string selectedBoatString,
  672.             DateTime earliestSlot, DateTime firstDarknessSlot)
  673.         {
  674.             var claimedSlots = new List<DateTime>();
  675.  
  676.             // Verkrijg de reserveringen voor de geselecteerde boot.
  677.             new ReservationController()
  678.                 .GetReservationsForDayAndBoatThatAreNotDeleted(selectedDate,
  679.                     new BoatController().GetBoatWithName(selectedBoatString)).ForEach(reservation =>
  680.  
  681.                     // Zet de reserveringen in de database om in slots
  682.                     {
  683.                         for (var i = DateTimeToDayQuarter(reservation.Start);
  684.                         i < DateTimeToDayQuarter(reservation.End);
  685.                         i++)
  686.                             claimedSlots.Add(DayQuarterToDateTime(selectedDate, i));
  687.                     });
  688.             var datePartOfDateTimeNow = now.Date;
  689.  
  690.             // Als de geselecteerde dag vandaag is, dan moeten er ook nog slots die al voorbij zijn worden grijs gemaakt
  691.             // Voeg slots die voorbij zijn toe aan de geclaimde slots
  692.             // Als de geselecteerde dag overmorgen is
  693.             // (of het ingelogde lid is wedstrijdcommissaris en de geselecteerde dag is over een jaar),
  694.             // dan moeten er ook nog slots die te ver weg zijn worden grijs gemaakt
  695.             // Voeg slots die te ver weg zijn aan de geclaimde slots
  696.             // In de andere gevallen, retourneer alleen de geclaimde slots
  697.  
  698.  
  699.             if (selectedDate.Date.Equals(datePartOfDateTimeNow))
  700.                 return GetClaimedAndPastSlots(claimedSlots, now, earliestSlot, firstDarknessSlot);
  701.             else if (DateIsLastReservableDate(new UserController().LoggedInUserIsRaceCommissioner(),
  702.                 datePartOfDateTimeNow,
  703.                 selectedDate))
  704.                 return GetClaimedAndTooDistantSlots(claimedSlots, selectedDate, now);
  705.             else return claimedSlots;
  706.         }
  707.  
  708.         // Controleer of de datum die nu geselecteerd is, de laatst mogelijke datum is
  709.         private bool DateIsLastReservableDate(bool loggedInUserIsRaceCommissioner, DateTime now, DateTime selectedDate)
  710.         {
  711.             var latestDateThatThisUserMayReserve = loggedInUserIsRaceCommissioner ? now.AddYears(1) : now.AddDays(2);
  712.             return selectedDate.Date.Equals(latestDateThatThisUserMayReserve);
  713.         }
  714.  
  715.         // Voeg slots die voorbij zijn toe aan de geclaimde slots
  716.         private List<DateTime> GetClaimedAndPastSlots(List<DateTime> claimedSlots, DateTime now, DateTime earliestSlot,
  717.             DateTime firstDarknessSlot)
  718.         {
  719.             var claimedAndPastSlots = new List<DateTime>(claimedSlots);
  720.             var earliestSlotDayQuarter = DateTimeToDayQuarter(earliestSlot);
  721.             var slotThatIsNow = DateTimeToDayQuarter(TopRoundTimeToSlot(now));
  722.             var firstDarknessSlotDayQuarter = DateTimeToDayQuarter(firstDarknessSlot);
  723.  
  724.             // De laatste slot die als "voorbij" moet worden gemarkeerd is de slot van dit moment,
  725.             // maar de laatste grijze slot mag niet voorbij de laatste slot waar het nog licht is komen.
  726.             var latestSlotThatShouldBeMarkedAsDue = new[] { slotThatIsNow, firstDarknessSlotDayQuarter }.Min();
  727.  
  728.             // Meng de slots in het verleden samen met de slots die al geclaimd zijn.
  729.             // Als er al een slot in het verleden geclaimd is,
  730.             // dan wordt die niet dubbel grijs gemaakt
  731.             for (var i = earliestSlotDayQuarter; i < latestSlotThatShouldBeMarkedAsDue; i++)
  732.             {
  733.                 var passedSlot = DayQuarterToDateTime(now, i);
  734.                 if (!claimedSlots.Contains(passedSlot)) claimedAndPastSlots.Add(passedSlot);
  735.             }
  736.  
  737.             return claimedAndPastSlots;
  738.         }
  739.  
  740.         // Voeg slots die te ver weg zijn aan de geclaimde slots
  741.         public List<DateTime> GetClaimedAndTooDistantSlots(List<DateTime> claimedSlots, DateTime lastReservableDay, DateTime now)
  742.         {
  743.             var claimedAndTooDistantSlots = new List<DateTime>(claimedSlots);
  744.             var sunriseAndSunsetTimesForTwoDaysFromNow = GetSunriseAndSunsetTimes(lastReservableDay);
  745.             var earliestSlotTwoDaysFromNow = GetFirstLightSlot(sunriseAndSunsetTimesForTwoDaysFromNow[0]);
  746.             var firstDarknessSlotTwoDaysFromNow = GetFirstDarknessSlot(sunriseAndSunsetTimesForTwoDaysFromNow[1]);
  747.             var earliestSlotDayQuarter = DateTimeToDayQuarter(earliestSlotTwoDaysFromNow);
  748.             var lastReservableDaySameTimeAsNow = lastReservableDay.AddHours(now.Hour).AddMinutes(now.Minute);
  749.             var slotThatIsTwoDaysFromNow = DateTimeToDayQuarter(BottomRoundTimeToSlot(lastReservableDaySameTimeAsNow));
  750.  
  751.             // De vroegste slot die als "te ver in de toekomst" moet worden gemarkeerd is de slot van dit tijdstip over twee dagen,
  752.             // maar de eerste grijze slot mag niet voor de eerste slot waar het al licht is komen.
  753.             var earliestSlotThatShouldBeMarkedAsTooDistant =
  754.                 new[] { earliestSlotDayQuarter, slotThatIsTwoDaysFromNow }.Max();
  755.             var firstDarknessSlotDayQuarter = DateTimeToDayQuarter(firstDarknessSlotTwoDaysFromNow);
  756.  
  757.             // Meng de slots te ver in de toekomst samen met de slots die al geclaimd zijn.
  758.             // Als er al een slot te ver in de toekomst geclaimd is,
  759.             // dan wordt die niet dubbel grijs gemaakt
  760.             for (var i = earliestSlotThatShouldBeMarkedAsTooDistant; i < firstDarknessSlotDayQuarter; i++)
  761.             {
  762.                 var tooDistantSlot = DayQuarterToDateTime(lastReservableDay, i);
  763.                 if (!claimedSlots.Contains(tooDistantSlot)) claimedAndTooDistantSlots.Add(tooDistantSlot);
  764.             }
  765.  
  766.             return claimedAndTooDistantSlots;
  767.         }
  768.  
  769.         // Zet een datum om naar een dagkwartier. Het dagkwartier van 8.30 is 34
  770.         // (8 uren * 4 kwartieren per uur = 32 kwartieren,
  771.         // 30 minuten / 15 minuten per kwartieren = 2 kwartieren,
  772.         // bij elkaar opgeteld is 34)
  773.         public int DateTimeToDayQuarter(DateTime time) => time.Hour * 4 + time.Minute / 15;
  774.  
  775.         // Zet een dagkwartier om naar een datumtijd. De tijd van dagkwartier 34 is 8.30
  776.         // (34 kwartieren / 4 kwartieren per uur = 8 uren rest 2,
  777.         // 2 kwartieren * 15 minuten per kwartier = 30 minuten,
  778.         // bij elkaar opgeteld is 8 uur 30 minuten = 8.30)
  779.         public DateTime DayQuarterToDateTime(DateTime selectedDate,
  780.             int dayQuarter) => new DateTime(selectedDate.Year,
  781.             selectedDate.Month,
  782.             selectedDate.Day,
  783.             dayQuarter / 4,
  784.             dayQuarter % 4 * 15,
  785.             00);
  786.  
  787.         private void OnPlannerGridClick(object sender, MouseButtonEventArgs e)
  788.         {
  789. //            MessageBox.Show("Hoi");
  790.             var position = e.GetPosition(PlannerGrid);
  791.             var x = position.X;
  792.             var y = position.Y;
  793.             if (x >= 0 && x < 200 && y >= 0 && _reservationStartComboBox.SelectedIndex >= 0 && ReservationDurationComboBox.SelectedIndex >= 0)
  794.             {
  795.                 var minutes = PlannerGrid.GetMinutesFromX(x);
  796.                 var hour = PlannerGrid.GetHourFromY(y);
  797.                 _selectsDuration = !_selectsDuration;
  798.                 if (_selectsDuration)
  799.                 {
  800. //                    MessageBox.Show($"{DateTime.Today.AddHours(hour).AddMinutes(minutes).ToLongTimeString()}, selecteert duur");
  801.                     var selectedIndex = SelectStart(hour, minutes);
  802.                     if (selectedIndex.HasValue)
  803.                     {
  804.                         ReservationDurationComboBox.SelectedIndex = 0;
  805.                         _reservationStartComboBox.SelectedIndex = selectedIndex.Value;
  806.                         OnStartComboBoxClick(null, null);
  807.                     }
  808.                 }
  809.                 else
  810.                 {
  811. //                    MessageBox.Show($"{DateTime.Today.AddHours(hour).AddMinutes(minutes).ToLongTimeString()}, selecteert begin");
  812.                     var selectedIndex = SelectDuration(hour, minutes, DateTime.Parse(_reservationStartComboBox.SelectedValue.ToString()));
  813.                     if (selectedIndex.HasValue)
  814.                     {
  815.                         ReservationDurationComboBox.SelectedIndex = selectedIndex.Value;
  816.                         OnDurationComboBoxClick(null, null);
  817.                     }
  818.                 }
  819.  
  820.             }
  821.             else
  822.             {
  823.                 _selectsDuration = false;
  824.             }
  825.         }
  826.  
  827.         private int? SelectDuration(int hour, int minutes, DateTime selectedStartSlot)
  828.         {
  829.             var items = ReservationDurationComboBox.Items;
  830.             for (int i = 0; i < items.Count; i++)
  831.             {
  832.                 var item = items[i];
  833.                 var extraHours = int.Parse(item.ToString().Substring(0, 2));
  834.                 var extraMinutes = int.Parse(item.ToString().Substring(3, 2));
  835.                 var endSlot = selectedStartSlot.AddHours(extraHours).AddMinutes(extraMinutes).AddMinutes(-15);
  836.                 if (endSlot.Hour == hour && endSlot.Minute == minutes)
  837.                 {
  838.                     return i;
  839.                 }
  840.             }
  841.  
  842.             return null;
  843.         }
  844.  
  845.         private int? SelectStart(int hour, int minutes)
  846.         {
  847.             var items = _reservationStartComboBox.Items;
  848.             for (var i = 0; i < items.Count; i++)
  849.             {
  850.                 var item = items[i];
  851.                 var startSlot = DateTime.Parse(item.ToString());
  852.                 if (startSlot.Hour == hour && startSlot.Minute == minutes)
  853.                 {
  854.                     return i;
  855.                 }
  856.             }
  857.  
  858.             return null;
  859.         }
  860.     }
  861. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement