271 lines
12 KiB
C#
271 lines
12 KiB
C#
// Copyright (c) 2017 schick Informatik
|
|
// Description: Control für die Auftragsbearbeitung (Rahmen)
|
|
//
|
|
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.Windows.Controls;
|
|
|
|
using bsmd.database;
|
|
using ENI2.DetailViewControls;
|
|
using ENI2.Util;
|
|
using System.Windows;
|
|
using System.Windows.Data;
|
|
|
|
namespace ENI2
|
|
{
|
|
/// <summary>
|
|
/// Interaction logic for DetailRootControl.xaml
|
|
/// </summary>
|
|
public partial class DetailRootControl : UserControl
|
|
{
|
|
|
|
#region Fields
|
|
|
|
private MessageCore _core;
|
|
private List<MessageGroup> _listBoxList = new List<MessageGroup>();
|
|
private List<Message> _messages;
|
|
private Dictionary<Type, DetailBaseControl> controlCache = new Dictionary<Type, DetailBaseControl>();
|
|
private Guid userId = Guid.NewGuid(); // remove THIS!!
|
|
private object messageListLock = new object();
|
|
|
|
#endregion
|
|
|
|
#region Properties
|
|
|
|
public MessageCore Core { get { return this._core; } }
|
|
|
|
public bool LockedByOtherUser { get; set; }
|
|
|
|
public ReportingParty LockedBy { get; set; }
|
|
|
|
internal event DatabaseEntityWatchdog.DatabaseEntityChangedHandler HighlightReset;
|
|
|
|
#endregion
|
|
|
|
#region Construction
|
|
|
|
public DetailRootControl(MessageCore aCore)
|
|
{
|
|
_core = aCore;
|
|
InitializeComponent();
|
|
shipNameLabel.Text = aCore.Shipname;
|
|
displayIdLabel.Text = aCore.DisplayId;
|
|
|
|
|
|
// Listbox befüllen
|
|
this._listBoxList.Add(new MessageGroup() { MessageGroupName = Properties.Resources.textOverview, MessageGroupControlType = typeof(OverViewDetailControl), ImagePath = "Resources/documents.png" });
|
|
this._listBoxList.Add(new MessageGroup() { MessageGroupName = Properties.Resources.textPortCall, MessageGroupControlType = typeof(PortCallDetailControl), ImagePath = "Resources/eye_blue.png" });
|
|
this._listBoxList.Add(new MessageGroup() { MessageGroupName = Properties.Resources.textPortNotification, MessageGroupControlType = typeof(PortNotificationDetailControl), ImagePath = "Resources/anchor.png" });
|
|
this._listBoxList.Add(new MessageGroup() { MessageGroupName = Properties.Resources.textWaste, MessageGroupControlType = typeof(WasteDetailControl), ImagePath = "Resources/garbage.png" });
|
|
this._listBoxList.Add(new MessageGroup() { MessageGroupName = Properties.Resources.textArrivalNotification, MessageGroupControlType = typeof(ArrivalNotificationDetailControl), ImagePath = "Resources/arrow_down_right_red.png" });
|
|
this._listBoxList.Add(new MessageGroup() { MessageGroupName = Properties.Resources.textSecurity, MessageGroupControlType = typeof(SecurityDetailControl), ImagePath = "Resources/shield_yellow.png" });
|
|
this._listBoxList.Add(new MessageGroup() { MessageGroupName = Properties.Resources.textPSC72h, MessageGroupControlType = typeof(PSC72hDetailControl), ImagePath = "Resources/alarmclock.png" });
|
|
this._listBoxList.Add(new MessageGroup() { MessageGroupName = Properties.Resources.textMDH, MessageGroupControlType = typeof(MaritimeHealthDeclarationDetailControl), ImagePath = "Resources/medical_bag.png" });
|
|
this._listBoxList.Add(new MessageGroup() { MessageGroupName = Properties.Resources.textDepartureNotification, MessageGroupControlType = typeof(DepartureNotificationDetailControl), ImagePath = "Resources/arrow_up_right_green.png" });
|
|
this._listBoxList.Add(new MessageGroup() { MessageGroupName = Properties.Resources.textShipData, MessageGroupControlType = typeof(ShipDataDetailControl), ImagePath = "Resources/containership.png" });
|
|
this._listBoxList.Add(new MessageGroup() { MessageGroupName = Properties.Resources.textBorderPolice, MessageGroupControlType = typeof(BorderPoliceDetailControl), ImagePath = "Resources/policeman_german.png" });
|
|
this._listBoxList.Add(new MessageGroup() { MessageGroupName = Properties.Resources.textDGArrival, MessageGroupControlType = typeof(DangerousGoodsDetailControl), ImagePath = "Resources/sign_warning_radiation.png" });
|
|
this._listBoxList.Add(new MessageGroup() { MessageGroupName = Properties.Resources.textDGDeparture, MessageGroupControlType = typeof(DangerousGoodsDetailControl), ImagePath = "Resources/sign_warning_radiation.png" });
|
|
this._listBoxList.Add(new MessageGroup() { MessageGroupName = Properties.Resources.textTowage, MessageGroupControlType = typeof(TowageDetailControl), ImagePath = "Resources/ship2.png" });
|
|
|
|
|
|
this.listBoxMessages.ItemsSource = this._listBoxList;
|
|
|
|
// Locking ergänzt. Ich habe den Eindruck, dass die DataReader Fehler beim BSMD daran liegen, dass das hier länger dauert als
|
|
// man eine neue Anmeldung anklickt -> paralleles Laden -> Autsch
|
|
lock (DBManager.Instance)
|
|
{
|
|
_messages = DBManager.Instance.GetMessagesForCore(_core, DBManager.MessageLoad.ALL);
|
|
}
|
|
BindingOperations.EnableCollectionSynchronization(_messages, this.messageListLock);
|
|
Dispatcher.BeginInvoke((Action)(() => this.listBoxMessages.SelectedIndex = 0));
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region class MessageGroup
|
|
|
|
/// <summary>
|
|
/// Klasse um ein Element der Listbox darzustellen (notwendig für das Databinding)
|
|
/// </summary>
|
|
public class MessageGroup
|
|
{
|
|
public Type MessageGroupControlType { get; set; }
|
|
public string MessageGroupName { get; set; }
|
|
public string ImagePath { get; set; }
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region event handler
|
|
|
|
private void listBoxMessages_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
|
{
|
|
if(listBoxMessages.SelectedItem != null)
|
|
{
|
|
MessageGroup mg = this.listBoxMessages.SelectedItem as MessageGroup;
|
|
if (!controlCache.ContainsKey(mg.MessageGroupControlType))
|
|
{
|
|
// create control instance for display:
|
|
DetailBaseControl detailControl = (DetailBaseControl)Activator.CreateInstance(mg.MessageGroupControlType);
|
|
detailControl.Core = _core;
|
|
detailControl.Messages = _messages;
|
|
detailControl.LockedByOtherUser = this.LockedByOtherUser;
|
|
|
|
detailControl.JumpToListElementRequest += (index) =>
|
|
{
|
|
if ((index >= 0) && (index < _listBoxList.Count))
|
|
{
|
|
this.listBoxMessages.SelectedIndex = index;
|
|
}
|
|
};
|
|
|
|
detailControl.RequestReload += DetailControl_RequestReload;
|
|
detailControl.NotificationClassChanged += DetailControl_NotificationClassChanged;
|
|
|
|
detailControl.Initialize();
|
|
detailControl.IsEnabled = !this.LockedByOtherUser;
|
|
|
|
if (!detailControl.IsEnabled && (detailControl is OverViewDetailControl))
|
|
((OverViewDetailControl)detailControl).ShowLockedBy(this.LockedBy);
|
|
|
|
controlCache.Add(mg.MessageGroupControlType, detailControl);
|
|
this.buttonSave.Visibility = Visibility.Hidden;
|
|
}
|
|
else
|
|
{
|
|
// Control has been created before: Set visibility of "save" button:
|
|
bool hasDirtyMessages = false;
|
|
DetailBaseControl dbc = controlCache[mg.MessageGroupControlType];
|
|
foreach (Message message in dbc.ControlMessages)
|
|
if (message.IsDirty)
|
|
hasDirtyMessages = true;
|
|
this.buttonSave.Visibility = hasDirtyMessages ? Visibility.Visible : Visibility.Hidden;
|
|
}
|
|
|
|
// plug it in ;-)
|
|
detailView.Children.Clear();
|
|
detailView.Children.Add(controlCache[mg.MessageGroupControlType]);
|
|
}
|
|
}
|
|
|
|
private void buttonSave_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
MessageBoxResult result = MessageBox.Show(Properties.Resources.textQuestionSavePage, Properties.Resources.textConfirmation,
|
|
MessageBoxButton.YesNo, MessageBoxImage.Question);
|
|
if (result == MessageBoxResult.Yes)
|
|
{
|
|
DetailBaseControl currentControl = this.detailView.Children[0] as DetailBaseControl;
|
|
if (currentControl != null)
|
|
{
|
|
foreach (Message message in currentControl.ControlMessages)
|
|
{
|
|
if (message.IsDirty)
|
|
{
|
|
DBManager.Instance.Save(message);
|
|
message.SaveElements();
|
|
message.IsDirty = false;
|
|
}
|
|
}
|
|
this.buttonSave.Visibility = Visibility.Hidden;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
private void buttonSaveAll_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
MessageBoxResult result = MessageBox.Show(Properties.Resources.textQuestionSaveAll, Properties.Resources.textConfirmation,
|
|
MessageBoxButton.YesNo, MessageBoxImage.Question);
|
|
if (result == MessageBoxResult.Yes)
|
|
{
|
|
foreach(Message message in this._messages)
|
|
{
|
|
if (message.IsDirty)
|
|
{
|
|
DBManager.Instance.Save(message);
|
|
message.SaveElements();
|
|
message.IsDirty = false;
|
|
this.buttonSaveAll.Visibility = Visibility.Hidden;
|
|
this.buttonSave.Visibility = Visibility.Hidden;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void DetailControl_NotificationClassChanged(Message.NotificationClass notificationClass)
|
|
{
|
|
// in der Übersicht die Meldeklasse als geändert markieren..?
|
|
this.buttonSaveAll.Visibility = Visibility.Visible;
|
|
this.buttonSave.Visibility = Visibility.Visible;
|
|
}
|
|
|
|
private void DetailControl_RequestLock(bool shouldLock)
|
|
{
|
|
if(App.LockingServiceClient == null)
|
|
{
|
|
return;
|
|
}
|
|
if (shouldLock)
|
|
{
|
|
try
|
|
{
|
|
Guid lockedUserId = App.LockingServiceClient.Lock(this.Core.Id.Value, this.userId);
|
|
if (lockedUserId == Guid.Empty)
|
|
{
|
|
// lock successful
|
|
this.Core.Locked = true;
|
|
|
|
}
|
|
else
|
|
{
|
|
// locking failed: Notify User
|
|
|
|
}
|
|
}
|
|
catch(Exception ex)
|
|
{
|
|
Trace.WriteLine(ex.ToString());
|
|
// TODO
|
|
}
|
|
}
|
|
else
|
|
{
|
|
App.LockingServiceClient.Unlock(this.Core.Id.Value, this.userId);
|
|
this.Core.Locked = false;
|
|
}
|
|
}
|
|
|
|
private void DetailControl_RequestReload()
|
|
{
|
|
/// core und messages neu laden
|
|
///
|
|
lock (DBManager.Instance)
|
|
{
|
|
this._core = DBManager.Instance.GetMessageCoreById(this.Core.Id.Value);
|
|
this._messages = DBManager.Instance.GetMessagesForCore(this._core, DBManager.MessageLoad.ALL);
|
|
}
|
|
|
|
// clear existing controls
|
|
this.detailView.Children.Clear();
|
|
this.controlCache.Clear();
|
|
|
|
// return to "new" overview
|
|
Dispatcher.BeginInvoke((Action)(() => this.listBoxMessages_SelectionChanged(this, null)));
|
|
|
|
// if the entity has been highlighted (through remote change detection), reset this here
|
|
this.OnHighlightReset();
|
|
}
|
|
|
|
#endregion
|
|
|
|
protected virtual void OnHighlightReset()
|
|
{
|
|
this.HighlightReset?.Invoke(this.Core);
|
|
}
|
|
|
|
}
|
|
}
|