diff --git a/Tests/ViewModels/SettingsViewModelTest.cs b/Tests/ViewModels/SettingsViewModelTest.cs index 0ea9ad9..dec16f7 100755 --- a/Tests/ViewModels/SettingsViewModelTest.cs +++ b/Tests/ViewModels/SettingsViewModelTest.cs @@ -69,7 +69,7 @@ namespace Tests.ViewModels _settingsVM.AddElementViewModel(viewModel); viewModel.IsSelected = true; int oldViewModelChildrenCount = viewModel.Elements.Count; - int oldModelChildrenCount = model.FormatElements.Count; + int oldModelChildrenCount = model.Children.Count; _settingsVM.AddChildElementMessage.Sent += (sender, args) => { messageSent = true; @@ -84,7 +84,7 @@ namespace Tests.ViewModels Assert.IsTrue(messageSent, "Message was not sent"); Assert.AreEqual(oldViewModelChildrenCount + 1, viewModel.Elements.Count, "Count of children in ViewModel was not increased by 1"); - Assert.AreEqual(oldModelChildrenCount + 1, model.FormatElements.Count, + Assert.AreEqual(oldModelChildrenCount + 1, model.Children.Count, "Count of children in Model was not increased by 1"); } @@ -140,7 +140,7 @@ namespace Tests.ViewModels ElementViewModel elementVM = ((ControlElementViewModel)settingsVM.Elements.First()) .Elements.First(); ElementBase element = elementVM.RevealModelObject() as ElementBase; - Assert.IsTrue(((ControlElementBase)settings.Elements[0]).FormatElements.Contains(element), + Assert.IsTrue(((ControlElementBase)settings.Elements[0]).Children.Contains(element), "Settings object does not contain the model that the VM revealed?!"); elementVM.IsSelected = true; Assert.IsTrue(settingsVM.DeleteElementCommand.CanExecute(null), @@ -149,7 +149,7 @@ namespace Tests.ViewModels Assert.AreEqual(oldCount - 1, parent.Elements.Count); Assert.IsFalse(parent.Elements.Contains(elementVM), "Elements collection still contains the deleted element view model."); - Assert.IsFalse(((ControlElementBase)settings.Elements[0]).FormatElements.Contains(element), + Assert.IsFalse(((ControlElementBase)settings.Elements[0]).Children.Contains(element), "Settings' collection of FormatElement children still contains the element model."); } diff --git a/zaaReloaded2/Controller/Elements/ControlElementBase.cs b/zaaReloaded2/Controller/Elements/ControlElementBase.cs index 65a4564..a575b81 100755 --- a/zaaReloaded2/Controller/Elements/ControlElementBase.cs +++ b/zaaReloaded2/Controller/Elements/ControlElementBase.cs @@ -16,6 +16,7 @@ * limitations under the License. */ using System.Collections.Generic; +using System.Linq; namespace zaaReloaded2.Controller.Elements { @@ -29,19 +30,29 @@ namespace zaaReloaded2.Controller.Elements /// Gets a list of child elements, all of which must be derived /// from FormatElementBase. /// - public IList FormatElements { get; private set; } + public IList Children { get; internal set; } public ControlElementBase() : this(new List()) { } - public ControlElementBase(IList formatElements) + public ControlElementBase(IList children) { - FormatElements = formatElements; + Children = children; } - public ControlElementBase(FormatElementBase formatElement) - : this(new List() { formatElement }) + public ControlElementBase(FormatElementBase children) + : this(new List() { children }) { } + + /// + /// Creates a clone of the Children list (for use in cloning + /// derived classes). + /// + /// Clone of the Children list. + protected IList CloneChildren() + { + return Children.Select(child => child.Clone() as FormatElementBase).ToList(); + } } } diff --git a/zaaReloaded2/Controller/Elements/SelectEachDay.cs b/zaaReloaded2/Controller/Elements/SelectEachDay.cs index eed0093..824b116 100755 --- a/zaaReloaded2/Controller/Elements/SelectEachDay.cs +++ b/zaaReloaded2/Controller/Elements/SelectEachDay.cs @@ -26,7 +26,7 @@ namespace zaaReloaded2.Controller.Elements { public override string Label { - get { return "Jeden Tag auswählen"; } + get { return "Jeder Tag"; } } public override void Run(Formatter.Formatter formatter) @@ -46,7 +46,7 @@ namespace zaaReloaded2.Controller.Elements protected override ElementBase CreateInstance() { - return new SelectEachDay(); + return new SelectEachDay(CloneChildren()); } } } diff --git a/zaaReloaded2/Controller/Elements/SelectFirstDay.cs b/zaaReloaded2/Controller/Elements/SelectFirstDay.cs index f635948..6771800 100755 --- a/zaaReloaded2/Controller/Elements/SelectFirstDay.cs +++ b/zaaReloaded2/Controller/Elements/SelectFirstDay.cs @@ -30,7 +30,7 @@ namespace zaaReloaded2.Controller.Elements { public override string Label { - get { return "Ersten Tag auswählen"; } + get { return "Erster Tag"; } } public override void Run(Formatter.Formatter formatter) @@ -50,7 +50,7 @@ namespace zaaReloaded2.Controller.Elements protected override ElementBase CreateInstance() { - return new SelectFirstDay(); + return new SelectFirstDay(CloneChildren()); } } } diff --git a/zaaReloaded2/Controller/Elements/SelectLastDay.cs b/zaaReloaded2/Controller/Elements/SelectLastDay.cs index 2f5107a..e2d048e 100755 --- a/zaaReloaded2/Controller/Elements/SelectLastDay.cs +++ b/zaaReloaded2/Controller/Elements/SelectLastDay.cs @@ -31,7 +31,7 @@ namespace zaaReloaded2.Controller.Elements { public override string Label { - get { return "Letzten Tag auswählen"; } + get { return "Letzter Tag"; } } public override void Run(Formatter.Formatter formatter) @@ -51,7 +51,7 @@ namespace zaaReloaded2.Controller.Elements protected override ElementBase CreateInstance() { - return new SelectLastDay(); + return new SelectLastDay(CloneChildren()); } } } diff --git a/zaaReloaded2/Controller/Settings.cs b/zaaReloaded2/Controller/Settings.cs index cb81027..594ed15 100755 --- a/zaaReloaded2/Controller/Settings.cs +++ b/zaaReloaded2/Controller/Settings.cs @@ -87,6 +87,7 @@ namespace zaaReloaded2.Controller Uid = Guid.NewGuid(); Name = name; Elements = initialElements; + ReferenceStyle = Properties.Settings.Default.ReferenceStyle; if (Elements == null) { Elements = new List(); diff --git a/zaaReloaded2/Formatter/Formatter.cs b/zaaReloaded2/Formatter/Formatter.cs index b7bc89c..5ef0276 100755 --- a/zaaReloaded2/Formatter/Formatter.cs +++ b/zaaReloaded2/Formatter/Formatter.cs @@ -205,7 +205,7 @@ namespace zaaReloaded2.Formatter /// FormatElementBase children to process. public void ProcessAllTimePoints(ControlElementBase controlElement) { - ProcessAllTimePoints(controlElement.FormatElements); + ProcessAllTimePoints(controlElement.Children); } /// @@ -297,7 +297,7 @@ namespace zaaReloaded2.Formatter throw new ArgumentNullException("workingTimePoints"); WorkingTimePoints = workingTimePoints; - ProcessElements(controlElement.FormatElements); + ProcessElements(controlElement.Children); if (_primaryBuffer.HasBufferedText) { _primaryBuffer.Prepend( diff --git a/zaaReloaded2/Formatter/ReferenceStyle.cs b/zaaReloaded2/Formatter/ReferenceStyle.cs index 0e6c8f7..2d47b33 100755 --- a/zaaReloaded2/Formatter/ReferenceStyle.cs +++ b/zaaReloaded2/Formatter/ReferenceStyle.cs @@ -32,31 +32,31 @@ namespace zaaReloaded2.Formatter /// /// Never write normal ranges /// - [Description("Referenzbereich nie ausgeben")] + [Description("Niemals")] Never, /// /// Write normal range if item is marked in dictionary /// - [Description("Referenzbereich ausgeben, falls Parameter so markiert ist")] + [Description("Bei speziellen Parametern immer")] IfSpecialItem, /// /// Write normal range if value is abnormal /// - [Description("Referenzbereich ausgeben, falls Wert nicht normal ist")] + [Description("Bei pathologischem Wert")] IfAbnormal, /// /// Write normal range if item is marked in dictionary, or if value is abnormal /// - [Description("Referenzbereich ausgeben, falls Parameter so markiert ist oder falls Wert nicht normal ist")] + [Description("Bei pathologischem Wert oder speziellem Parameter")] IfSpecialOrAbnormal, /// /// Always write normal range reference /// - [Description("Referenzbereich immer ausgeben")] + [Description("Immer")] Always } } diff --git a/zaaReloaded2/Properties/Settings.Designer.cs b/zaaReloaded2/Properties/Settings.Designer.cs index 1a3bccc..cd3968c 100755 --- a/zaaReloaded2/Properties/Settings.Designer.cs +++ b/zaaReloaded2/Properties/Settings.Designer.cs @@ -254,5 +254,32 @@ namespace zaaReloaded2.Properties { return ((string)(this["ParagraphStyleName"])); } } + + [global::System.Configuration.ApplicationScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("IfSpecialOrAbnormal")] + public global::zaaReloaded2.Formatter.ReferenceStyle ReferenceStyle { + get { + return ((global::zaaReloaded2.Formatter.ReferenceStyle)(this["ReferenceStyle"])); + } + } + + [global::System.Configuration.ApplicationScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("Ausgabe-Elemente")] + public string FormatElementLabel { + get { + return ((string)(this["FormatElementLabel"])); + } + } + + [global::System.Configuration.ApplicationScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("Steuerungs-Elemente")] + public string ControlElementLabel { + get { + return ((string)(this["ControlElementLabel"])); + } + } } } diff --git a/zaaReloaded2/Properties/Settings.settings b/zaaReloaded2/Properties/Settings.settings index d8eee1d..2cecf23 100755 --- a/zaaReloaded2/Properties/Settings.settings +++ b/zaaReloaded2/Properties/Settings.settings @@ -77,5 +77,14 @@ zaaReloaded2-Laborwerte + + IfSpecialOrAbnormal + + + Ausgabe-Elemente + + + Steuerungs-Elemente + \ No newline at end of file diff --git a/zaaReloaded2/ViewModels/ControlElementViewModel.cs b/zaaReloaded2/ViewModels/ControlElementViewModel.cs index 88b3969..826968a 100755 --- a/zaaReloaded2/ViewModels/ControlElementViewModel.cs +++ b/zaaReloaded2/ViewModels/ControlElementViewModel.cs @@ -47,7 +47,7 @@ namespace zaaReloaded2.ViewModels Elements = new ObservableCollection(); if (controlElement != null) { - foreach (FormatElementBase childElement in controlElement.FormatElements) + foreach (FormatElementBase childElement in controlElement.Children) { FormatElementViewModel childVM = new FormatElementViewModel(childElement); Elements.Add(childVM); @@ -55,6 +55,22 @@ namespace zaaReloaded2.ViewModels } } + /// + /// Creates a new instance by copying the Elements property from another + /// ControlElementViewModel and the Children property from the other + /// view model's model. + /// + /// Other ControlElementViewModel to copy + /// from. + public ControlElementViewModel( + ControlElementBase controlElement, + ControlElementViewModel copyFrom) + : this(controlElement) + { + Elements = copyFrom.Elements; + ((ControlElementBase)Element).Children = controlElement.Children; + } + #endregion #region Public methods @@ -64,7 +80,7 @@ namespace zaaReloaded2.ViewModels Elements.Add(viewModel); viewModel.Parent = this; ControlElementBase e = Element as ControlElementBase; - e.FormatElements.Add(viewModel.RevealModelObject() as FormatElementBase); + e.Children.Add(viewModel.RevealModelObject() as FormatElementBase); } public void RemoveChildElement(FormatElementViewModel viewModel) @@ -75,13 +91,15 @@ namespace zaaReloaded2.ViewModels "Cannot remove child view model that is not in the collection."); } Elements.Remove(viewModel); - ((ControlElementBase)Element).FormatElements + ((ControlElementBase)Element).Children .Remove(viewModel.RevealModelObject() as FormatElementBase); viewModel.Parent = null; } #endregion + #region Overrides + public override object Clone() { ControlElementViewModel clone = new ControlElementViewModel(); @@ -94,5 +112,7 @@ namespace zaaReloaded2.ViewModels } return clone; } + + #endregion } } diff --git a/zaaReloaded2/ViewModels/ElementPickerViewModel.cs b/zaaReloaded2/ViewModels/ElementPickerViewModel.cs index 557119c..a54c550 100755 --- a/zaaReloaded2/ViewModels/ElementPickerViewModel.cs +++ b/zaaReloaded2/ViewModels/ElementPickerViewModel.cs @@ -29,7 +29,9 @@ namespace zaaReloaded2.ViewModels { /// /// View model that presents a list of zaaReloaded2.Contorller.Elements.ElementBase - /// classes to choose from. + /// classes to choose from. Depending on which constructor is used, this view model + /// presents either a list of ControlElementBase-derived classes, a list of + /// FormatElementBase-derived classes, or both. /// class ElementPickerViewModel : ViewModelBase { @@ -98,7 +100,7 @@ namespace zaaReloaded2.ViewModels { AddCategory( new CategoryViewModel( - "Kontroll-Elemente", + Properties.Settings.Default.ControlElementLabel, new Collection() { CreateControlElementViewModel(new SelectFirstDay()), @@ -108,13 +110,27 @@ namespace zaaReloaded2.ViewModels ) ); } + CreateFormatElementViewModels(); + } + + /// + /// Creates a new element picker for control elements only; + /// the selected ControlElementVieModel will copy the Elements + /// property from a source view model. + /// + /// ControlElementViewModel + /// whose Elements property to copy. + public ElementPickerViewModel(ControlElementViewModel copyFromViewModel) + { + Categories = new List(); AddCategory( new CategoryViewModel( - "Ausgabe-Elemente", + Properties.Settings.Default.ControlElementLabel, new Collection() { - CreateFormatElementViewModel("Laborparameter", new Items()), - CreateFormatElementViewModel("Beliebiger Text", new CustomText()), + CreateControlElementViewModel(new SelectFirstDay(), copyFromViewModel), + CreateControlElementViewModel(new SelectLastDay(), copyFromViewModel), + CreateControlElementViewModel(new SelectEachDay(), copyFromViewModel) } ) ); @@ -124,6 +140,20 @@ namespace zaaReloaded2.ViewModels #region Private methods + void CreateFormatElementViewModels() + { + AddCategory( + new CategoryViewModel( + Properties.Settings.Default.FormatElementLabel, + new Collection() + { + CreateFormatElementViewModel("Laborparameter", new Items()), + CreateFormatElementViewModel("Beliebiger Text", new CustomText()), + } + ) + ); + } + void AddCategory(CategoryViewModel category) { category.PropertyChanged += ElementViewModel_PropertyChanged; @@ -143,6 +173,15 @@ namespace zaaReloaded2.ViewModels return vm; } + ViewModelBase CreateControlElementViewModel( + ControlElementBase element, ControlElementViewModel copyFromViewModel) + { + ControlElementViewModel vm = new ControlElementViewModel(element, copyFromViewModel); + vm.DisplayString = element.Label; + vm.PropertyChanged += ElementViewModel_PropertyChanged; + return vm; + } + /// /// Creates a new FormatElementViewModel that wraps a FormatElementBase /// object and has a custom display string. The custom display string @@ -176,6 +215,7 @@ namespace zaaReloaded2.ViewModels if (CanChooseElement()) { ElementChosenMessage.Send(new ViewModelMessageContent(Selected)); + DoCloseView(); } } diff --git a/zaaReloaded2/ViewModels/ElementViewModel.cs b/zaaReloaded2/ViewModels/ElementViewModel.cs index add2138..f8b4c7c 100755 --- a/zaaReloaded2/ViewModels/ElementViewModel.cs +++ b/zaaReloaded2/ViewModels/ElementViewModel.cs @@ -42,6 +42,14 @@ namespace zaaReloaded2.ViewModels } } + public override string DisplayString + { + get + { + return Label; + } + } + #endregion #region Constructors diff --git a/zaaReloaded2/ViewModels/FormatElementViewModel.cs b/zaaReloaded2/ViewModels/FormatElementViewModel.cs index 21483f2..373e79e 100755 --- a/zaaReloaded2/ViewModels/FormatElementViewModel.cs +++ b/zaaReloaded2/ViewModels/FormatElementViewModel.cs @@ -20,6 +20,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; +using Bovender.Mvvm; using zaaReloaded2.Controller.Elements; namespace zaaReloaded2.ViewModels @@ -31,10 +32,10 @@ namespace zaaReloaded2.ViewModels public string Content { [DebuggerStepThrough] - get { return ((FormatElementBase)Element).Content; } + get { return _content; } set { - ((FormatElementBase)Element).Content = value; + _content = value; OnPropertyChanged("Content"); } } @@ -47,6 +48,24 @@ namespace zaaReloaded2.ViewModels #endregion + #region Commands + + public DelegatingCommand SaveCommand + { + get + { + if (_saveCommand == null) + { + _saveCommand = new DelegatingCommand( + param => DoSave(), + param => CanSave()); + } + return _saveCommand; + } + } + + #endregion + #region Constructors public FormatElementViewModel() : base() { } @@ -55,10 +74,13 @@ namespace zaaReloaded2.ViewModels : this() { Element = formatElement; + Content = ((FormatElementBase)Element).Content; } #endregion + #region Overrides + public override object Clone() { FormatElementViewModel clone = new FormatElementViewModel(); @@ -66,5 +88,52 @@ namespace zaaReloaded2.ViewModels clone.Element = Element; return clone; } + + public override string DisplayString + { + get + { + if (String.IsNullOrEmpty(Content)) + { + return _displayString; + } + else + { + return base.DisplayString; + } + } + set + { + _displayString = value; + } + } + + #endregion + + #region Private methods + + void DoSave() + { + ((FormatElementBase)Element).Content = _content; + // Writing the _content field to the model affects our + // DisplayString property; this is a hack to make it known. + OnPropertyChanged("DisplayString"); + CloseViewCommand.Execute(null); + } + + bool CanSave() + { + return !String.IsNullOrEmpty(Content); + } + + #endregion + + #region Fields + + DelegatingCommand _saveCommand; + string _displayString; + string _content; + + #endregion } } diff --git a/zaaReloaded2/ViewModels/SettingsRepositoryViewModel.cs b/zaaReloaded2/ViewModels/SettingsRepositoryViewModel.cs index 6277d1f..c398e57 100755 --- a/zaaReloaded2/ViewModels/SettingsRepositoryViewModel.cs +++ b/zaaReloaded2/ViewModels/SettingsRepositoryViewModel.cs @@ -238,8 +238,9 @@ namespace zaaReloaded2.ViewModels Settings s = new Settings("Neu"); SettingsViewModel vm = new SettingsViewModel(s); _repository.SettingsList.Add(s); - SettingsList.Add(vm); + AddSettingsViewModel(vm); vm.IsSelected = true; + EditSettingsMessage.Send(new ViewModelMessageContent(vm)); } bool CanDeleteSettings() @@ -291,6 +292,7 @@ namespace zaaReloaded2.ViewModels AddSettingsViewModel(copy); LastSelected.IsSelected = false; copy.IsSelected = true; + EditSettingsMessage.Send(new ViewModelMessageContent(copy)); } } diff --git a/zaaReloaded2/ViewModels/SettingsViewModel.cs b/zaaReloaded2/ViewModels/SettingsViewModel.cs index 8eb178c..3308203 100755 --- a/zaaReloaded2/ViewModels/SettingsViewModel.cs +++ b/zaaReloaded2/ViewModels/SettingsViewModel.cs @@ -26,6 +26,7 @@ using Bovender.Mvvm.Messaging; using zaaReloaded2.Controller; using zaaReloaded2.Controller.Elements; using zaaReloaded2.Formatter; +using System.Collections.ObjectModel; namespace zaaReloaded2.ViewModels { @@ -104,7 +105,12 @@ namespace zaaReloaded2.ViewModels { if (_referenceStyle == null) { - _referenceStyle = new EnumProvider(_settings.ReferenceStyle); + _referenceStyle = new EnumProvider(); + _referenceStyle.AsEnum = _settings.ReferenceStyle; + _referenceStyle.PropertyChanged += (sender, args) => + { + _settings.ReferenceStyle = _referenceStyle.AsEnum; + }; } return _referenceStyle; } @@ -122,7 +128,7 @@ namespace zaaReloaded2.ViewModels : base() { _settings = settings; - Elements = new List(); + Elements = new ObservableCollection(); foreach (ElementBase element in settings.Elements) { ElementViewModel vm; @@ -177,6 +183,30 @@ namespace zaaReloaded2.ViewModels } } + public Message EditElementMessage + { + get + { + if (_editElementMessage == null) + { + _editElementMessage = new Message(); + } + return _editElementMessage; + } + } + + public Message ChangeControlElementMessage + { + get + { + if (_changeControlElementMessage == null) + { + _changeControlElementMessage = new Message(); + } + return _changeControlElementMessage; + } + } + #endregion #region Commands @@ -208,6 +238,20 @@ namespace zaaReloaded2.ViewModels } } + public DelegatingCommand EditElementCommand + { + get + { + if (_editElementCommand == null) + { + _editElementCommand = new DelegatingCommand( + param => DoEditElement(), + param => CanEditElement()); + } + return _editElementCommand; + } + } + public DelegatingCommand DeleteElementCommand { get @@ -275,6 +319,8 @@ namespace zaaReloaded2.ViewModels { ElementViewModel newVM = args.Content.ViewModel as ElementViewModel; AddElementViewModel(newVM); + newVM.IsSelected = true; + DoEditElement(); }; AddElementMessage.Send(new ViewModelMessageContent(picker)); } @@ -290,6 +336,8 @@ namespace zaaReloaded2.ViewModels { FormatElementViewModel newVM = args.Content.ViewModel as FormatElementViewModel; AddChildElementViewModel(LastSelectedElement as ControlElementViewModel, newVM); + newVM.IsSelected = true; + DoEditElement(); }; AddChildElementMessage.Send(new ViewModelMessageContent(picker)); } @@ -300,6 +348,41 @@ namespace zaaReloaded2.ViewModels return LastSelectedElement is ControlElementViewModel; } + void DoEditElement() + { + if (CanEditElement()) + { + if (LastSelectedElement is ControlElementViewModel) + { + ElementPickerViewModel picker = new ElementPickerViewModel( + LastSelectedElement as ControlElementViewModel); + picker.ElementChosenMessage.Sent += (sender, args) => + { + // Replace the previously selected element with the new + // one that we get from the ElementPickerViewModel. + ElementViewModel newVM = args.Content.ViewModel as ElementViewModel; + Elements.Insert( + Elements.IndexOf(LastSelectedElement), + newVM); + Elements.Remove(LastSelectedElement); + newVM.PropertyChanged += ElementViewModel_PropertyChanged; + newVM.IsSelected = true; + }; + ChangeControlElementMessage.Send( + new ViewModelMessageContent(picker)); + } + else + { + EditElementMessage.Send(new ViewModelMessageContent(LastSelectedElement)); + } + } + } + + bool CanEditElement() + { + return LastSelectedElement != null && LastSelectedElement.IsSelected; + } + /// /// Deletes the selected element. /// @@ -403,10 +486,13 @@ namespace zaaReloaded2.ViewModels Settings _settings; DelegatingCommand _addElementCommand; DelegatingCommand _addChildElementCommand; + DelegatingCommand _editElementCommand; DelegatingCommand _deleteElementCommand; DelegatingCommand _copyElementCommand; Message _addElementMessage; Message _addChildElementMessage; + Message _editElementMessage; + Message _changeControlElementMessage; ElementViewModel _selectedElement; EnumProvider _referenceStyle; diff --git a/zaaReloaded2/Views/ElementPickerView.xaml b/zaaReloaded2/Views/ElementPickerView.xaml index e845457..24d865a 100755 --- a/zaaReloaded2/Views/ElementPickerView.xaml +++ b/zaaReloaded2/Views/ElementPickerView.xaml @@ -26,28 +26,25 @@ Title="Neues Element auswählen" > - - - - - - - - - - - - - +