// Copyright (c) 2023 schick Informatik // Description: Windows dialog to create / edit ship calls // using BreCalClient.misc.Model; using System; using System.Collections.Generic; using System.Linq; using System.Windows; using System.Windows.Controls; using static BreCalClient.Extensions; namespace BreCalClient { /// /// Interaction logic for EditShipcallControl.xaml /// public partial class EditShipcallControl : Window { public EditShipcallControl() { InitializeComponent(); } #region Properties public ShipcallControlModel ShipcallModel { get; set; } = new (); /// /// All participants /// public List Participants { get; set; } = new(); /// /// All berths /// public List Berths { get; set; } = new(); /// /// All ships /// public List Ships { get; set; } = new(); public Ship? SelectedShip { get { return this.comboBoxShip.SelectedItem as Ship; } } #endregion #region Event handler private void Window_Loaded(object sender, RoutedEventArgs e) { List aList = new(); List mList = new(); List pList = new(); List tList = new(); List terList = new(); foreach(Participant p in Participants) { if (p.IsTypeFlagSet(Extensions.ParticipantType.AGENCY)) aList.Add(p); if (p.IsTypeFlagSet(Extensions.ParticipantType.MOORING)) mList.Add(p); if (p.IsTypeFlagSet(Extensions.ParticipantType.PILOT)) pList.Add(p); if (p.IsTypeFlagSet(Extensions.ParticipantType.TUG)) tList.Add(p); if (p.IsTypeFlagSet(Extensions.ParticipantType.TERMINAL)) terList.Add(p); } this.comboBoxAgency.ItemsSource = aList; this.comboBoxMooring.ItemsSource = mList; this.comboBoxPilot.ItemsSource = pList; this.comboBoxTug.ItemsSource = tList; this.comboBoxTerminal.ItemsSource = terList; this.comboBoxShip.ItemsSource = Ships; this.comboBoxCategories.ItemsSource = Enum.GetValues(typeof(Extensions.TypeEnum)); this.comboBoxArrivalBerth.ItemsSource = this.Berths; this.comboBoxDepartureBerth.ItemsSource = this.Berths; this.CopyToControls(); this.EnableControls(); } private void buttonOK_Click(object sender, RoutedEventArgs e) { this.CopyToModel(); this.DialogResult = true; this.Close(); } private void buttonCancel_Click(object sender, RoutedEventArgs e) { this.DialogResult= false; this.Close(); } private void comboBoxShip_SelectionChanged(object sender, SelectionChangedEventArgs e) { this.buttonOK.IsEnabled = this.comboBoxShip.SelectedItem != null; } private void comboBoxAgency_SelectionChanged(object sender, SelectionChangedEventArgs e) { this.EnableControls(); } #endregion #region Context menu handlers private void contextMenuItemClearAgency_Click(object sender, RoutedEventArgs e) { this.comboBoxAgency.SelectedIndex = -1; this.ShipcallModel.AssignedParticipants.Remove(Extensions.ParticipantType.AGENCY); } private void contextMenuItemClearMooring_Click(object sender, RoutedEventArgs e) { this.comboBoxMooring.SelectedIndex = -1; this.ShipcallModel.AssignedParticipants.Remove(Extensions.ParticipantType.MOORING); } private void contextMenuItemClearPilot_Click(object sender, RoutedEventArgs e) { this.comboBoxPilot.SelectedIndex = -1; this.ShipcallModel.AssignedParticipants.Remove(Extensions.ParticipantType.PILOT); } private void contextMenuItemClearTug_Click(object sender, RoutedEventArgs e) { this.comboBoxTug.SelectedIndex = -1; this.ShipcallModel.AssignedParticipants.Remove(Extensions.ParticipantType.TUG); } private void contextMenuItemClearTerminal_Click(object sender, RoutedEventArgs e) { this.comboBoxTerminal.SelectedIndex = -1; this.ShipcallModel.AssignedParticipants.Remove(Extensions.ParticipantType.TERMINAL); } private void contextMenuItemArrivalBerth_Click(object sender, RoutedEventArgs e) { this.comboBoxArrivalBerth.SelectedIndex = -1; this.ShipcallModel.Berth = ""; } private void contextMenuItemDepartureBerth_Click(object sender, RoutedEventArgs e) { this.comboBoxDepartureBerth.SelectedIndex -= 1; } #endregion #region private methods private void CopyToModel() { if (this.ShipcallModel.Shipcall != null) { this.ShipcallModel.Shipcall.Type = (int)this.comboBoxCategories.SelectedItem; this.ShipcallModel.Shipcall.Eta = this.datePickerETA.Value ?? DateTime.Now; this.ShipcallModel.Shipcall.Voyage = this.textBoxVoyage.Text.Trim(); this.ShipcallModel.Shipcall.Etd = this.datePickerETD.Value ?? DateTime.Now.AddDays(1); this.ShipcallModel.Shipcall.Anchored = this.checkBoxAnchored.IsChecked; this.ShipcallModel.Shipcall.ShipId = ((Ship)this.comboBoxShip.SelectedItem).Id; this.ShipcallModel.Shipcall.ArrivalBerthId = (this.comboBoxArrivalBerth.SelectedItem != null) ? ((Berth)this.comboBoxArrivalBerth.SelectedItem).Id : null; this.ShipcallModel.Shipcall.DepartureBerthId = (this.comboBoxDepartureBerth.SelectedItem != null) ? ((Berth)this.comboBoxDepartureBerth.SelectedItem).Id : null; this.ShipcallModel.Shipcall.Bunkering = this.checkBoxBunkering.IsChecked; this.ShipcallModel.Shipcall.Canceled = this.checkBoxCanceled.IsChecked; this.ShipcallModel.Shipcall.Draft = (float?)this.doubleUpDownDraft.Value; this.ShipcallModel.Shipcall.MooredLock = this.checkBoxMooredLock.IsChecked; this.ShipcallModel.Shipcall.RainSensitiveCargo = this.checkBoxRainsensitiveCargo.IsChecked; this.ShipcallModel.Shipcall.PilotRequired = this.checkBoxPilotRequired.IsChecked; this.ShipcallModel.Shipcall.ReplenishingLock = this.checkBoxReplenishingLock.IsChecked; this.ShipcallModel.Shipcall.ReplenishingTerminal = this.checkBoxReplenishingTerminal.IsChecked; this.ShipcallModel.Shipcall.RecommendedTugs = this.integerUpDownRecommendedTugs.Value; this.ShipcallModel.Shipcall.TidalWindowFrom = this.datePickerTidalWindowFrom.Value; this.ShipcallModel.Shipcall.TidalWindowTo = this.datePickerTidalWindowTo.Value; this.ShipcallModel.Shipcall.TugRequired = this.checkBoxTugRequired.IsChecked; if (this.comboBoxPierside.SelectedIndex >= 0) { this.ShipcallModel.Shipcall.PierSide = (this.comboBoxPierside.SelectedIndex == 0) ? true : false; } // remove all and add selected participants this.ShipcallModel.Shipcall.Participants.Clear(); this.ShipcallModel.AssignedParticipants.Clear(); Participant? participant; participant = (Participant?)this.comboBoxAgency.SelectedItem; if (participant != null) { this.ShipcallModel.Shipcall.Participants.Add(participant.Id); this.ShipcallModel.AssignedParticipants[Extensions.ParticipantType.AGENCY] = participant; } participant = (Participant?)this.comboBoxMooring.SelectedItem; if (participant != null) { this.ShipcallModel.Shipcall.Participants.Add(participant.Id); this.ShipcallModel.AssignedParticipants[Extensions.ParticipantType.MOORING] = participant; } participant = (Participant?)this.comboBoxPilot.SelectedItem; if (participant != null) { this.ShipcallModel.Shipcall.Participants.Add(participant.Id); this.ShipcallModel.AssignedParticipants[Extensions.ParticipantType.PILOT] = participant; } participant = (Participant?)this.comboBoxTerminal.SelectedItem; if (participant != null) { this.ShipcallModel.Shipcall.Participants.Add(participant.Id); this.ShipcallModel.AssignedParticipants[Extensions.ParticipantType.TERMINAL] = participant; } participant = (Participant?)this.comboBoxTug.SelectedItem; if (participant != null) { this.ShipcallModel.Shipcall.Participants.Add(participant.Id); this.ShipcallModel.AssignedParticipants[Extensions.ParticipantType.TUG] = participant; } // BSMD and port authority are always added foreach (Participant p in Participants) { if (p.Type == (int)Extensions.ParticipantType.PORT_ADMINISTRATION) { this.ShipcallModel.Shipcall.Participants.Add(p.Id); this.ShipcallModel.AssignedParticipants[Extensions.ParticipantType.PORT_ADMINISTRATION] = p; } if (p.Type == (int)Extensions.ParticipantType.BSMD) { this.ShipcallModel.Shipcall.Participants.Add(p.Id); this.ShipcallModel.AssignedParticipants[Extensions.ParticipantType.BSMD] = p; } } } } private void CopyToControls() { if (this.ShipcallModel == null) return; if (this.ShipcallModel.Shipcall != null) { this.comboBoxCategories.SelectedItem = (Extensions.TypeEnum)this.ShipcallModel.Shipcall.Type; if (this.ShipcallModel.Shipcall.Eta != DateTime.MinValue) this.datePickerETA.Value = this.ShipcallModel.Shipcall.Eta; this.textBoxVoyage.Text = this.ShipcallModel.Shipcall.Voyage; this.datePickerETD.Value = this.ShipcallModel.Shipcall.Etd; this.checkBoxAnchored.IsChecked = this.ShipcallModel.Shipcall.Anchored; this.comboBoxShip.SelectedValue = this.ShipcallModel.Shipcall.ShipId; this.comboBoxArrivalBerth.SelectedValue = this.ShipcallModel.Shipcall.ArrivalBerthId; this.comboBoxDepartureBerth.SelectedValue = this.ShipcallModel.Shipcall.DepartureBerthId; this.checkBoxBunkering.IsChecked = this.ShipcallModel.Shipcall.Bunkering; this.checkBoxCanceled.IsChecked = this.ShipcallModel.Shipcall.Canceled; this.doubleUpDownDraft.Value = this.ShipcallModel.Shipcall.Draft; this.checkBoxMooredLock.IsChecked = this.ShipcallModel.Shipcall.MooredLock; this.checkBoxRainsensitiveCargo.IsChecked = this.ShipcallModel.Shipcall.RainSensitiveCargo; this.checkBoxPilotRequired.IsChecked = this.ShipcallModel.Shipcall.PilotRequired; this.checkBoxReplenishingLock.IsChecked = this.ShipcallModel.Shipcall.ReplenishingLock; this.checkBoxReplenishingTerminal.IsChecked = this.ShipcallModel.Shipcall.ReplenishingTerminal; this.integerUpDownRecommendedTugs.Value = this.ShipcallModel.Shipcall.RecommendedTugs; this.datePickerTidalWindowFrom.Value = this.ShipcallModel.Shipcall.TidalWindowFrom; this.datePickerTidalWindowTo.Value = this.ShipcallModel.Shipcall.TidalWindowTo; this.checkBoxTugRequired.IsChecked = this.ShipcallModel.Shipcall.TugRequired; if (this.ShipcallModel.Shipcall.PierSide.HasValue) { if (this.ShipcallModel.Shipcall.PierSide.Value) this.comboBoxPierside.SelectedIndex = 0; else this.comboBoxPierside.SelectedIndex = 1; } if (this.ShipcallModel.Shipcall.Participants == null) this.ShipcallModel.Shipcall.Participants = new(); // Hier wird noch ein Problem vergessen: Wenn ein Participant mehrere Types gleichzeitig ist und es einen weitere Participant mit diesem Type gibt // müsste der "einzelne" Participant für die Rolle ausgewählt werden. (Angenommen ein Test-Teilnehmer hat "alle" Rollen..) foreach (int participant_id in this.ShipcallModel.Shipcall.Participants) { if (((List)this.comboBoxAgency.ItemsSource).Any(x => x.Id == participant_id)) this.comboBoxAgency.SelectedValue = participant_id; if (((List)this.comboBoxMooring.ItemsSource).Any(x => x.Id == participant_id)) this.comboBoxMooring.SelectedValue = participant_id; if (((List)this.comboBoxPilot.ItemsSource).Any(x => x.Id == participant_id)) this.comboBoxPilot.SelectedValue = participant_id; if (((List)this.comboBoxTerminal.ItemsSource).Any(x => x.Id == participant_id)) this.comboBoxTerminal.SelectedValue = participant_id; if (((List)this.comboBoxTug.ItemsSource).Any(x => x.Id == participant_id)) this.comboBoxTug.SelectedValue = participant_id; } } } private void EnableControls() { bool isBsmd = App.Participant.IsTypeFlagSet(Extensions.ParticipantType.BSMD); bool isAgency = App.Participant.IsTypeFlagSet(Extensions.ParticipantType.AGENCY); bool editRightGrantedForBSMD = false; // Special case: Selected Agency allows BSMD to edit their fields if (this.comboBoxAgency.SelectedIndex >= 0) { int agencyParticipantId = (int)this.comboBoxAgency.SelectedValue; Participant? p = this.Participants.Find(x => x.Id == agencyParticipantId); if (p != null) { if(p.IsFlagSet(ParticipantFlag.ALLOW_BSMD) && isBsmd) isAgency = true; if(p.IsFlagSet(ParticipantFlag.ALLOW_BSMD)) editRightGrantedForBSMD = true; } } this.comboBoxAgency.IsEnabled = isBsmd; this.comboBoxArrivalBerth.IsEnabled = isBsmd || isAgency; this.comboBoxCategories.IsEnabled = isBsmd; this.comboBoxDepartureBerth.IsEnabled = isBsmd || isAgency; this.checkBoxAnchored.IsEnabled = isAgency; this.checkBoxBunkering.IsEnabled = isAgency; this.checkBoxCanceled.IsEnabled = isBsmd || isAgency; this.checkBoxMooredLock.IsEnabled = isAgency; this.checkBoxPilotRequired.IsEnabled = isAgency; this.checkBoxRainsensitiveCargo.IsEnabled = isAgency; this.checkBoxReplenishingLock.IsEnabled = isAgency; this.checkBoxReplenishingTerminal.IsEnabled = isAgency; this.checkBoxTugRequired.IsEnabled = isAgency; this.comboBoxMooring.IsEnabled = isBsmd; this.comboBoxPierside.IsEnabled = isAgency; this.comboBoxPilot.IsEnabled = isAgency; this.comboBoxShip.IsEnabled = isBsmd; this.comboBoxMooring.IsEnabled = isAgency; this.comboBoxTerminal.IsEnabled = isAgency; this.comboBoxTug.IsEnabled = isAgency; this.datePickerETA.IsEnabled = isAgency || isBsmd; this.datePickerETD.IsEnabled = isAgency; this.textBoxVoyage.IsEnabled = isAgency; this.datePickerTidalWindowFrom.IsEnabled = isAgency; this.datePickerTidalWindowTo.IsEnabled = isAgency; this.integerUpDownRecommendedTugs.IsEnabled = isAgency; this.doubleUpDownDraft.IsEnabled = isAgency || isBsmd; this.labelBSMDGranted.Visibility = editRightGrantedForBSMD ? Visibility.Visible : Visibility.Hidden; } #endregion } }