345 lines
16 KiB
C#
345 lines
16 KiB
C#
// 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
|
|
{
|
|
/// <summary>
|
|
/// Interaction logic for EditShipcallControl.xaml
|
|
/// </summary>
|
|
public partial class EditShipcallControl : Window
|
|
{
|
|
public EditShipcallControl()
|
|
{
|
|
InitializeComponent();
|
|
}
|
|
|
|
#region Properties
|
|
|
|
public ShipcallControlModel ShipcallModel { get; set; } = new ();
|
|
|
|
/// <summary>
|
|
/// All participants
|
|
/// </summary>
|
|
public List<Participant> Participants { get; set; } = new();
|
|
|
|
/// <summary>
|
|
/// All berths
|
|
/// </summary>
|
|
public List<Berth> Berths { get; set; } = new();
|
|
|
|
/// <summary>
|
|
/// All ships
|
|
/// </summary>
|
|
public List<Ship> 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<Participant> aList = new();
|
|
List<Participant> mList = new();
|
|
List<Participant> pList = new();
|
|
List<Participant> tList = new();
|
|
List<Participant> 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<Participant>)this.comboBoxAgency.ItemsSource).Any(x => x.Id == participant_id)) this.comboBoxAgency.SelectedValue = participant_id;
|
|
if (((List<Participant>)this.comboBoxMooring.ItemsSource).Any(x => x.Id == participant_id)) this.comboBoxMooring.SelectedValue = participant_id;
|
|
if (((List<Participant>)this.comboBoxPilot.ItemsSource).Any(x => x.Id == participant_id)) this.comboBoxPilot.SelectedValue = participant_id;
|
|
if (((List<Participant>)this.comboBoxTerminal.ItemsSource).Any(x => x.Id == participant_id)) this.comboBoxTerminal.SelectedValue = participant_id;
|
|
if (((List<Participant>)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
|
|
|
|
}
|
|
}
|