// Copyright (c) 2025 - schick Informatik // Description: Display control of formsheet Tab 4. Pre-Departure // using bsmd.database; using ENI2.EditControls; using System; using System.Windows; using System.Windows.Controls; using System.Windows.Media.Imaging; namespace ENI2.SheetDisplayControls { /// /// Interaction logic for PreDepartureControl.xaml /// public partial class PreDepartureControl : DetailBaseControl { #region Fields private TIEFD _tiefd; private POBD _pobd; private Message _brkaMessage; private Message _brkdMessage; private HAZ _haz; private Message _towaMessage; private Message _towdMessage; private bool _ctxInitialized = false; #endregion #region Construction public PreDepartureControl() { InitializeComponent(); Loaded += PreDepartureControl_Loaded; } #endregion #region public override public override void Initialize() { base.Initialize(); foreach (Message aMessage in this.Messages) { if (aMessage.MessageNotificationClass == Message.NotificationClass.TIEFD) { this._tiefd = aMessage.Elements[0] as TIEFD; this.ControlMessages.Add(aMessage); } if (aMessage.MessageNotificationClass == Message.NotificationClass.POBD) { this._pobd = aMessage.Elements[0] as POBD; this.ControlMessages.Add(aMessage); } if (aMessage.MessageNotificationClass == Message.NotificationClass.BKRA) { this._brkaMessage = aMessage; this.ControlMessages.Add(aMessage); } if (aMessage.MessageNotificationClass == Message.NotificationClass.BKRD) { this._brkdMessage = aMessage; this.ControlMessages.Add(aMessage); } if (aMessage.MessageNotificationClass == Message.NotificationClass.HAZD) { this._haz = aMessage.Elements[0] as HAZ; this.ControlMessages.Add(aMessage); } if (aMessage.MessageNotificationClass == Message.NotificationClass.TOWA) { this._towaMessage = aMessage; this.ControlMessages.Add(aMessage); } if (aMessage.MessageNotificationClass == Message.NotificationClass.TOWD) { this._towdMessage = aMessage; this.ControlMessages.Add(aMessage); } } // 4.1 this.doubleUpDownDraught.DataContext = this._tiefd; // 4.2 this.integerUpDownPersonsOnBoard.DataContext = this._pobd; this.integerUpDownCrewMemberOnBoard.DataContext = this._pobd; this.integerUpDownPassengersOnBoard.DataContext = this._pobd; this.integerUpDownStowawaysOnBoard.DataContext = this._pobd; // 4.3 this.dataGridBKRD.Initialize(); this.dataGridBKRD.ItemsSource = this._brkdMessage.Elements; this.dataGridBKRD.AddingNewItem += DataGridBKRD_AddingNewItem; this.dataGridBKRD.EditRequested += DataGridBKRD_EditRequested; this.dataGridBKRD.DeleteRequested += DataGridBKRD_DeleteRequested; this.dataGridBKRD.CreateRequested += DataGridBKRD_CreateRequested; // 4.4 this.checkBoxDangerousGoodsOnBoard.DataContext = this._haz; // 4.5 if (this._towdMessage == null) { this._towdMessage = this.Core.CreateMessage(Message.NotificationClass.TOWD); this.Messages.Add(this._towdMessage); } this.dataGridTowageOnDeparture.Initialize(); this.dataGridTowageOnDeparture.ItemsSource = this._towdMessage.Elements; this.dataGridTowageOnDeparture.AddingNewItem += DataGridTowageOnDeparture_AddingNewItem; this.dataGridTowageOnDeparture.EditRequested += DataGridTowageOnDeparture_EditRequested; this.dataGridTowageOnDeparture.DeleteRequested += DataGridTowageOnDeparture_DeleteRequested; this.dataGridTowageOnDeparture.CreateRequested += DataGridTowageOnDeparture_CreateRequested; } public override void SetEnabled(bool enabled) { base.SetEnabled(enabled); this.preDepartureGroupBox.IsEnabled = enabled; } #endregion #region event handler private void PreDepartureControl_Loaded(object sender, RoutedEventArgs e) { // 4.1 this.RegisterDoubleUpDownChange(this.doubleUpDownDraught, Message.NotificationClass.TIEFD); // 4.2 this.RegisterIntegerUpDownChange(this.integerUpDownCrewMemberOnBoard, Message.NotificationClass.POBD); this.RegisterIntegerUpDownChange(this.integerUpDownPassengersOnBoard, Message.NotificationClass.POBD); this.RegisterIntegerUpDownChange(this.integerUpDownPersonsOnBoard, Message.NotificationClass.POBD); this.RegisterIntegerUpDownChange(this.integerUpDownStowawaysOnBoard, Message.NotificationClass.POBD); // 4.3 this.dataGridBKRD.CellEditEnding += (obj, ev) => { this.SublistElementChanged(Message.NotificationClass.BKRD); }; // Extra Menüpunkt um alle Bunker Positionen nach BKRA zu kopieren if (!_ctxInitialized) { this.dataGridBKRD.ContextMenu.Items.Add(new Separator()); MenuItem copyBKRItem = new MenuItem(); copyBKRItem.Header = Properties.Resources.textCopyToBKRD; copyBKRItem.Icon = new Image { Source = new BitmapImage(new Uri("pack://application:,,,/Resources/documents.png")) }; copyBKRItem.Click += this.copyBKR; this.dataGridBKRD.ContextMenu.Items.Add(copyBKRItem); } // 4.4 this.RegisterCheckboxChange(this.checkBoxDangerousGoodsOnBoard, Message.NotificationClass.HAZD); // 4.5 if (!_ctxInitialized) { this.dataGridTowageOnDeparture.ContextMenu.Items.Add(new Separator()); MenuItem copyItem = new MenuItem(); copyItem.Header = string.Format(Properties.Resources.textCopyTo, "TOWA"); copyItem.Icon = new Image { Source = new BitmapImage(new Uri("pack://application:,,,/Resources/documents.png")) }; copyItem.Click += new RoutedEventHandler(this.copyTOWAItem); this.dataGridTowageOnDeparture.ContextMenu.Items.Add(copyItem); } _ctxInitialized = true; } private void copyBKR(object sender, RoutedEventArgs e) { if (this.dataGridBKRD.SelectedItems != null) { foreach (BRKD brkd in this.dataGridBKRD.SelectedItems) { BRKA copyBRKA = new BRKA(); copyBRKA.MessageHeader = this._brkdMessage; copyBRKA.CopyFromBKRD(brkd); copyBRKA.Identifier = DatabaseEntity.GetNewIdentifier(this._brkaMessage.Elements); this._brkaMessage.Elements.Add(copyBRKA); this.SublistElementChanged(Message.NotificationClass.BKRA); } } } private void copyTOWAItem(object sender, RoutedEventArgs e) { // aus dem aktuell selektierten TOWD Element ein neues TOWA Element machen if (this.dataGridTowageOnDeparture.SelectedItems != null) { foreach (TOWD selectedTOWD in this.dataGridTowageOnDeparture.SelectedItems) { TOWA copyTOWA = new TOWA(); copyTOWA.MessageHeader = _towaMessage; copyTOWA.CopyFromTOWD(selectedTOWD); copyTOWA.Identifier = TOWA.GetNewIdentifier(this._towaMessage.Elements); this._towaMessage.Elements.Add(copyTOWA); this.SublistElementChanged(Message.NotificationClass.TOWA); } } } #endregion #region BKRD grid events private void DataGridBKRD_CreateRequested() { this.dataGridBKRD.CancelEdit(); this.dataGridBKRD.CancelEdit(); EditBKRDialog ebd = new EditBKRDialog(); ebd.BRKD = new BRKD(); ebd.BRKD.Identifier = BRKD.GetNewIdentifier(this._brkdMessage.Elements); ebd.BRKD.MessageHeader = _brkdMessage; ebd.IsDeparture = true; ebd.AddClicked += () => { ebd.CopyValuesToEntity(); if (!this._brkdMessage.Elements.Contains(ebd.BRKD)) this._brkdMessage.Elements.Add(ebd.BRKD); this.dataGridBKRD.Items.Refresh(); ebd.BRKD = new BRKD(); ebd.BRKD.Identifier = BRKD.GetNewIdentifier(this._brkdMessage.Elements); ebd.BRKD.MessageHeader = _brkdMessage; this.SublistElementChanged(Message.NotificationClass.BKRD); }; if (ebd.ShowDialog() ?? false) { if (!_brkdMessage.Elements.Contains(ebd.BRKD)) _brkdMessage.Elements.Add(ebd.BRKD); this.dataGridBKRD.Items.Refresh(); this.SublistElementChanged(Message.NotificationClass.BKRD); } } private void DataGridBKRD_DeleteRequested(DatabaseEntity obj) { if (obj is BRKD brkd) { this.dataGridBKRD.CancelEdit(); this.dataGridBKRD.CancelEdit(); // are you sure dialog is in base class DBManager.GetSingleCon(Properties.Settings.Default.ConnectionString).Delete(brkd); this._brkdMessage.Elements.Remove(brkd); DatabaseEntity.ResetIdentifiers(this._brkdMessage.Elements); this.SublistElementChanged(Message.NotificationClass.BKRD); this.dataGridBKRD.Items.Refresh(); } } private void DataGridBKRD_EditRequested(DatabaseEntity obj) { // I am not shitting you: this has to be called TWICE(!) in a row in order to work // see: https://stackoverflow.com/questions/20204592/wpf-datagrid-refresh-is-not-allowed-during-an-addnew-or-edititem-transaction-m this.dataGridBKRD.CancelEdit(DataGridEditingUnit.Row); this.dataGridBKRD.CommitEdit(DataGridEditingUnit.Row, true); EditBKRDialog eld = new EditBKRDialog(); eld.IsDeparture = true; eld.BRKD = obj as BRKD; eld.AddClicked += () => { eld.CopyValuesToEntity(); if (!_brkdMessage.Elements.Contains(eld.BRKD)) _brkdMessage.Elements.Add(eld.BRKD); this.dataGridBKRD.ItemsSource = null; this.dataGridBKRD.ItemsSource = this._brkdMessage.Elements; eld.BRKD = new BRKD(); eld.BRKD.Identifier = BRKD.GetNewIdentifier(this._brkdMessage.Elements); eld.BRKD.MessageHeader = _brkdMessage; this.SublistElementChanged(Message.NotificationClass.BKRD); }; if (eld.ShowDialog() ?? false) { if (!_brkdMessage.Elements.Contains(eld.BRKD)) _brkdMessage.Elements.Add(eld.BRKD); this.dataGridBKRD.ItemsSource = null; this.dataGridBKRD.ItemsSource = this._brkaMessage.Elements; this.SublistElementChanged(Message.NotificationClass.BKRD); } } private void DataGridBKRD_AddingNewItem(object sender, System.Windows.Controls.AddingNewItemEventArgs e) { this.DataGridBKRD_CreateRequested(); } #endregion #region TOWD grid private void DataGridTowageOnDeparture_CreateRequested() { EditTOWDialog ebd = new EditTOWDialog(); ebd.IsDeparture = true; ebd.TOWD = new TOWD(); ebd.TOWD.Identifier = TOWD.GetNewIdentifier(this._towdMessage.Elements); ebd.TOWD.MessageHeader = this._towdMessage; ebd.AddClicked += () => { ebd.CopyValuesToEntity(); if (!this._towdMessage.Elements.Contains(ebd.TOWD)) this._towdMessage.Elements.Add(ebd.TOWD); this.dataGridTowageOnDeparture.Items.Refresh(); ebd.TOWD = new TOWD(); ebd.TOWD.MessageHeader = _towdMessage; ebd.TOWD.Identifier = TOWD.GetNewIdentifier(this._towdMessage.Elements); this.SublistElementChanged(Message.NotificationClass.TOWD); }; if (ebd.ShowDialog() ?? false) { if (!this._towdMessage.Elements.Contains(ebd.TOWD)) _towdMessage.Elements.Add(ebd.TOWD); this.dataGridTowageOnDeparture.Items.Refresh(); this.SublistElementChanged(Message.NotificationClass.TOWD); } } private void DataGridTowageOnDeparture_DeleteRequested(DatabaseEntity obj) { if (obj is TOWD towd) { // are you sure dialog is in base class this._towdMessage.Elements.Remove(towd); DBManager.GetSingleCon(Properties.Settings.Default.ConnectionString).Delete(towd); DatabaseEntity.ResetIdentifiers(this._towdMessage.Elements); this.SublistElementChanged(Message.NotificationClass.TOWD); this.dataGridTowageOnDeparture.Items.Refresh(); } } private void DataGridTowageOnDeparture_EditRequested(DatabaseEntity obj) { EditTOWDialog eld = new EditTOWDialog(); eld.IsDeparture = true; eld.TOWD = obj as TOWD; eld.AddClicked += () => { eld.CopyValuesToEntity(); if (!_towdMessage.Elements.Contains(eld.TOWD)) _towdMessage.Elements.Add(eld.TOWD); this.dataGridTowageOnDeparture.Items.Refresh(); eld.TOWD = new TOWD(); eld.TOWD.Identifier = TOWD.GetNewIdentifier(this._towdMessage.Elements); eld.TOWD.MessageHeader = _towdMessage; this.SublistElementChanged(Message.NotificationClass.TOWD); }; if (eld.ShowDialog() ?? false) { if (!this._towdMessage.Elements.Contains(eld.TOWD)) this._towdMessage.Elements.Add(eld.TOWD); this.dataGridTowageOnDeparture.Items.Refresh(); this.SublistElementChanged(Message.NotificationClass.TOWD); } } private void DataGridTowageOnDeparture_AddingNewItem(object sender, System.Windows.Controls.AddingNewItemEventArgs e) { this.DataGridTowageOnDeparture_CreateRequested(); } #endregion } }