diff --git a/ENI-2/ENI2/ENI2/DetailBaseControl.cs b/ENI-2/ENI2/ENI2/DetailBaseControl.cs index 94467804..d1ac9dc1 100644 --- a/ENI-2/ENI2/ENI2/DetailBaseControl.cs +++ b/ENI-2/ENI2/ENI2/DetailBaseControl.cs @@ -32,6 +32,7 @@ namespace ENI2 private Dictionary _controlClassDict = new Dictionary(); private Dictionary _typeMessageDict = new Dictionary(); private List _controlMessages = new List(); + #endregion @@ -56,10 +57,15 @@ namespace ENI2 public event Action JumpToListElementRequest; /// - /// Mit diesem Event kann ein Listen-Element einen Reload der gesamten Anmeldung auslösen (ob das so eine tolle Idee ist.) + /// Mit diesem Event kann ein Listen-Element einen Reload der gesamten Anmeldung auslösen /// public event Action RequestReload; + /// + /// Damit kann ein Listenelement eine Validierung der gesamten Anmeldung auslösen (inkl. Highlighting) + /// + public event Action RequestValidate; + /// /// Eine in der Detailansicht enthaltene Meldeklasse hat sich geändert /// @@ -132,6 +138,11 @@ namespace ENI2 this.RequestReload?.Invoke(); } + protected virtual void OnRequestValidate() + { + this.RequestValidate?.Invoke(); + } + protected virtual void OnControlCacheReset(string messageGroupName) { this.ResetControlCache?.Invoke(messageGroupName); diff --git a/ENI-2/ENI2/ENI2/DetailRootControl.xaml.cs b/ENI-2/ENI2/ENI2/DetailRootControl.xaml.cs index 9547472f..9abc39a7 100644 --- a/ENI-2/ENI2/ENI2/DetailRootControl.xaml.cs +++ b/ENI-2/ENI2/ENI2/DetailRootControl.xaml.cs @@ -26,11 +26,16 @@ namespace ENI2 private MessageCore _core; private List _listBoxList = new List(); private List _messages; - private Dictionary controlCache = new Dictionary(); + private Dictionary controlCache = new Dictionary(); + private Dictionary messageClassControlDict = new Dictionary(); private Guid userId = Guid.NewGuid(); // remove THIS!! private object messageListLock = new object(); private HighlightService highlightService = new HighlightService(); + // Validation + protected List _vErrors = new List(); + protected List _vViolations = new List(); + #endregion #region Properties @@ -128,6 +133,7 @@ namespace ENI2 detailControl.RequestReload += DetailControl_RequestReload; detailControl.NotificationClassChanged += DetailControl_NotificationClassChanged; detailControl.ResetControlCache += DetailControl_ResetControlCache; + detailControl.RequestValidate += DetailControl_RequestValidate; detailControl.Initialize(); detailControl.IsEnabled = !this.LockedByOtherUser; @@ -159,7 +165,7 @@ namespace ENI2 detailView.Children.Add(controlCache[mg.MessageGroupName]); } - } + } private void DetailControl_ResetControlCache(string messageGroupName) { @@ -284,14 +290,115 @@ namespace ENI2 // if the entity has been highlighted (through remote change detection), reset this here this.OnHighlightReset(); - } + } + + private void DetailControl_RequestValidate() + { + this._vErrors.Clear(); + this._vViolations.Clear(); + // TODO: clear highlighting + + RuleEngine ruleEngine = new RuleEngine(); + foreach (Message aMessage in _messages) + { + List errors = new List(); + List violations = new List(); + ruleEngine.ValidateMessage(aMessage, out errors, out violations); + + string messageGroup = this.MessageGroupForMessage(aMessage); + + if (messageGroup != null) + { + foreach (MessageError me in errors) + me.MessageGroupName = messageGroup; + foreach (MessageViolation mv in violations) + mv.MessageGroupName = messageGroup; + } + + this._vErrors.AddRange(errors); + this._vViolations.AddRange(violations); + } + + + foreach (MessageError me in this._vErrors) + { + this.highlightService.HighlightError(me, this.GetContainerForMessageGroupName(me.MessageGroupName)); + } + foreach (MessageViolation mv in this._vViolations) + { + + this.highlightService.HighlightViolation(mv, this.GetContainerForMessageGroupName(mv.MessageGroupName)); + } + } #endregion + #region private / protected methods + protected virtual void OnHighlightReset() { this.HighlightReset?.Invoke(this.Core); } + private DependencyObject GetContainerForMessageGroupName(string messageGroupName) + { + if (controlCache.ContainsKey(messageGroupName)) + return controlCache[messageGroupName]; + return null; + } + + protected string MessageGroupForMessage(Message mh) + { + if (mh == null) return null; + switch(mh.MessageNotificationClass) + { + case Message.NotificationClass.ATA: + case Message.NotificationClass.TIEFA: + case Message.NotificationClass.POBA: + case Message.NotificationClass.BKRA: + return Properties.Resources.textArrivalNotification; + case Message.NotificationClass.BPOL: + case Message.NotificationClass.CREW: + case Message.NotificationClass.CREWD: + case Message.NotificationClass.PAS: + case Message.NotificationClass.PASD: + return Properties.Resources.textBorderPolice; + case Message.NotificationClass.HAZA: + return Properties.Resources.textDGArrival; + case Message.NotificationClass.HAZD: + return Properties.Resources.textDGDeparture; + case Message.NotificationClass.ATD: + case Message.NotificationClass.TIEFD: + case Message.NotificationClass.POBD: + case Message.NotificationClass.BKRD: + return Properties.Resources.textDepartureNotification; + case Message.NotificationClass.MDH: + return Properties.Resources.textMDH; + case Message.NotificationClass.NOA_NOD: + return Properties.Resources.textOverview; + case Message.NotificationClass.AGNT: + return Properties.Resources.textPortCall; + case Message.NotificationClass.NAME: + case Message.NotificationClass.INFO: + case Message.NotificationClass.SERV: + case Message.NotificationClass.LADG: + return Properties.Resources.textPortNotification; + case Message.NotificationClass.PRE72H: + return Properties.Resources.textPSC72h; + case Message.NotificationClass.SEC: + return Properties.Resources.textSecurity; + case Message.NotificationClass.STAT: + return Properties.Resources.textShipData; + case Message.NotificationClass.TOWA: + case Message.NotificationClass.TOWD: + return Properties.Resources.textTowage; + case Message.NotificationClass.WAS: + return Properties.Resources.textWaste; + } + return null; + } + + #endregion + } } diff --git a/ENI-2/ENI2/ENI2/DetailViewControls/MaritimeHealthDeclarationDetailControl.xaml b/ENI-2/ENI2/ENI2/DetailViewControls/MaritimeHealthDeclarationDetailControl.xaml index 51dbca63..1eb51447 100644 --- a/ENI-2/ENI2/ENI2/DetailViewControls/MaritimeHealthDeclarationDetailControl.xaml +++ b/ENI-2/ENI2/ENI2/DetailViewControls/MaritimeHealthDeclarationDetailControl.xaml @@ -75,10 +75,10 @@ - + - + diff --git a/ENI-2/ENI2/ENI2/DetailViewControls/OverViewDetailControl.xaml b/ENI-2/ENI2/ENI2/DetailViewControls/OverViewDetailControl.xaml index 8c180716..224aa0ed 100644 --- a/ENI-2/ENI2/ENI2/DetailViewControls/OverViewDetailControl.xaml +++ b/ENI-2/ENI2/ENI2/DetailViewControls/OverViewDetailControl.xaml @@ -66,7 +66,7 @@