From e272f62629222054519b61b40f8f4e7cf5204c84 Mon Sep 17 00:00:00 2001 From: mdn <1stdragon@gmail.com> Date: Sat, 5 Dec 2015 23:39:07 +0100 Subject: [PATCH] =?UTF-8?q?Aufger=C3=A4umt=20und=20mit=20Kommentaren=20ver?= =?UTF-8?q?sehen=20(KeyedCollection=20dabei=20eingebaut)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TimeScheduler/Common/BindingProxy.cs | 2 +- .../TimeScheduler/Common/MathUtil.cs | 29 +++-- TimeScheduler/TimeScheduler/Domain/IDomain.cs | 21 +++- .../TimeScheduler/Domain/Impl/FileDomain.cs | 71 ++++++----- .../TimeScheduler/Domain/Impl/SimpleTimes.cs | 90 ++++++++++++++ .../TimeScheduler/Domain/Impl/TimeItem.cs | 56 ++++++++- TimeScheduler/TimeScheduler/MainWindow.xaml | 5 +- .../TimeScheduler/Model/ITimeItem.cs | 3 + .../Properties/Resources.Designer.cs | 71 ----------- .../TimeScheduler/Properties/Resources.resx | 117 ------------------ .../Properties/Settings.Designer.cs | 30 ----- .../Properties/Settings.settings | 7 -- .../TimeScheduler/TimeScheduler.csproj | 21 +--- .../TimeScheduler/ViewModel/MainViewModel.cs | 24 ++-- 14 files changed, 242 insertions(+), 305 deletions(-) create mode 100644 TimeScheduler/TimeScheduler/Domain/Impl/SimpleTimes.cs delete mode 100644 TimeScheduler/TimeScheduler/Properties/Resources.Designer.cs delete mode 100644 TimeScheduler/TimeScheduler/Properties/Resources.resx delete mode 100644 TimeScheduler/TimeScheduler/Properties/Settings.Designer.cs delete mode 100644 TimeScheduler/TimeScheduler/Properties/Settings.settings diff --git a/TimeScheduler/TimeScheduler/Common/BindingProxy.cs b/TimeScheduler/TimeScheduler/Common/BindingProxy.cs index 0bf7614..572102c 100644 --- a/TimeScheduler/TimeScheduler/Common/BindingProxy.cs +++ b/TimeScheduler/TimeScheduler/Common/BindingProxy.cs @@ -7,7 +7,7 @@ namespace TimeScheduler.Common /// Vorbereitung: /// /// <FrameworkElement.Resources> - /// &tl;c:BindingProxy x:Key="proxy" Data="{Binding}"> + /// <c:BindingProxy x:Key="proxy" Data="{Binding}"> /// </FrameworkElement.Resources> /// /// Verwendung an einer anderen Stelle: diff --git a/TimeScheduler/TimeScheduler/Common/MathUtil.cs b/TimeScheduler/TimeScheduler/Common/MathUtil.cs index 6aab752..46c3572 100644 --- a/TimeScheduler/TimeScheduler/Common/MathUtil.cs +++ b/TimeScheduler/TimeScheduler/Common/MathUtil.cs @@ -1,32 +1,45 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace TimeScheduler.Common { + /// Mathematische Funktionen public static class MathUtil { - public static int IncrementDecrementNumber(string num, int minValue, int maxVal, bool increment) + /// Verringert/Erhöht die Zahl + /// Nummer die verändert werden soll + /// Minmal erlaubter Wert + /// Maximal erlaubter Wert + /// Veränderungsrichtung + /// Der veränderte Wert + public static int IncrementDecrementNumber(string num, int minValue, int maxValue, bool increment) { - int newNum = ValidateNumber(num, minValue, maxVal); + int newNum = ValidateNumber(num, minValue, maxValue); if (increment) - newNum = Math.Min(newNum + 1, maxVal); + newNum = Math.Min(newNum + 1, maxValue); else newNum = Math.Max(newNum - 1, 0); return newNum; } + /// Prüft den Wert auf den gültigen Bereich + /// zu Prüfender Wert + /// Minmal erlaubter Wert + /// Maximal erlaubter Wert + /// Der Wert, wenn er im Bereich liegt, sonst der jeweilige Grenzwert, der überschriten wurde public static int ValidateNumber(string newNum, int minValue, int maxValue) { int num; if (!int.TryParse(newNum, out num)) - return 0; + num = 0; return ValidateNumber(num, minValue, maxValue); } + /// Prüft den Wert auf den gültigen Bereich + /// zu Prüfender Wert + /// Minmal erlaubter Wert + /// Maximal erlaubter Wert + /// Der Wert, wenn er im Bereich liegt, sonst der jeweilige Grenzwert, der überschriten wurde public static int ValidateNumber(int newNum, int minValue, int maxValue) { newNum = Math.Max(newNum, minValue); diff --git a/TimeScheduler/TimeScheduler/Domain/IDomain.cs b/TimeScheduler/TimeScheduler/Domain/IDomain.cs index 2a031c5..d6dd570 100644 --- a/TimeScheduler/TimeScheduler/Domain/IDomain.cs +++ b/TimeScheduler/TimeScheduler/Domain/IDomain.cs @@ -1,20 +1,29 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using TimeScheduler.Model; -namespace TimeScheduler.Model +namespace TimeScheduler.Domain { /// Schnittstelle zum Provider der die Daten ermitteln public interface IDomain { - List GetItems(DateTime date); + /// Ermittelt die Werte für den angegebenen Tag + /// Der Tag für den Werte gesucht werden sollen + /// Die Daten, für den angefragten Tag + IEnumerable GetItems(DateTime date); + /// Ermittelt die gültigen Kostenstellen + /// Liste der gültigen Kostenstellen Dictionary GetCostUnits(); - void ElementAdded(ITimeItem timeItem); + /// Fügt ein neues Element hinzu + /// Das neue Element + int ElementAdded(ITimeItem timeItem); + /// Verändert ein vorhandenes Element + /// die neuen Daten void ElementChanged(ITimeItem timeItem); + /// Entfernt ein Element + /// Das zu entfernende Element void ElementRemoved(ITimeItem timeItem); } } diff --git a/TimeScheduler/TimeScheduler/Domain/Impl/FileDomain.cs b/TimeScheduler/TimeScheduler/Domain/Impl/FileDomain.cs index d3bf89f..34d5824 100644 --- a/TimeScheduler/TimeScheduler/Domain/Impl/FileDomain.cs +++ b/TimeScheduler/TimeScheduler/Domain/Impl/FileDomain.cs @@ -4,16 +4,16 @@ using System.IO; using System.Runtime.Serialization.Formatters.Binary; using System.Xml.Serialization; using System.Linq; -using System.Reflection; +using TimeScheduler.Model; - -namespace TimeScheduler.Model.Impl +namespace TimeScheduler.Domain.Impl { class FileDomain : IDomain { #region Konstruktion - private List allItems_ = new List(); + private SimpleTimes allItems_ = new SimpleTimes(); private string filename_ = string.Empty; + private int lastKey_ = 0; public FileDomain() { @@ -25,13 +25,13 @@ namespace TimeScheduler.Model.Impl else { // Wenn nichts vorhanden, dann einen Spielsatz anlegen - allItems_ = new List { - new TimeItem { Description = "Desc 01", From = DateTime.Now.Subtract(TimeSpan.FromHours(2)), Till = DateTime.Now, CostUnit = 14, ItemType = TimeItemType.Normal }, - new TimeItem { Description = "Desc 02", From = DateTime.Now.Subtract(TimeSpan.FromHours(2)), Till = DateTime.Now, CostUnit = 13, ItemType = TimeItemType.Break }, - new TimeItem { Description = "Desc 03", From = DateTime.Now.Subtract(TimeSpan.FromHours(2)), Till = DateTime.Now, CostUnit = 12, ItemType = TimeItemType.Holiday }, - new TimeItem { Description = "Desc 04", From = DateTime.Now.Subtract(TimeSpan.FromHours(2)), Till = DateTime.Now, CostUnit = 11, ItemType = TimeItemType.Ill }, - new TimeItem { Description = "Desc 05", From = DateTime.Now.Subtract(TimeSpan.FromHours(2)), Till = DateTime.Now, CostUnit = 15, ItemType = TimeItemType.Normal }, - }; + allItems_.Add(new TimeItem("Desc 01", DateTime.Now.Date.Add(TimeSpan.FromHours(0)), DateTime.Now.Date.Add(TimeSpan.FromHours(1.5)), 11, TimeItemType.Normal, ++lastKey_)); + allItems_.Add(new TimeItem("Desc 02", DateTime.Now.Date.Add(TimeSpan.FromHours(2)), DateTime.Now.Date.Add(TimeSpan.FromHours(3.5)), 12, TimeItemType.Break, ++lastKey_)); + allItems_.Add(new TimeItem("Desc 03", DateTime.Now.Date.Add(TimeSpan.FromHours(4)), DateTime.Now.Date.Add(TimeSpan.FromHours(5.5)), 13, TimeItemType.Holiday, ++lastKey_)); + allItems_.Add(new TimeItem("Desc 04", DateTime.Now.Date.Add(TimeSpan.FromHours(6)), DateTime.Now.Date.Add(TimeSpan.FromHours(7.5)), 14, TimeItemType.Ill, ++lastKey_)); + allItems_.Add(new TimeItem("Desc 05", DateTime.Now.Date.Add(TimeSpan.FromHours(8)), DateTime.Now.Date.Add(TimeSpan.FromHours(9.5)), 15, TimeItemType.Normal, ++lastKey_)); + // und direkt speichern + Save(); } } #endregion @@ -41,9 +41,9 @@ namespace TimeScheduler.Model.Impl { var bin = new BinaryFormatter(); using (var rd = new FileStream(filePath, FileMode.Open)) - allItems_ = bin.Deserialize(rd) as List; + //allItems_ = bin.Deserialize(rd) as List; + allItems_ = bin.Deserialize(rd) as SimpleTimes; } - private void WriteList(string path) { var bin = new BinaryFormatter(); @@ -53,13 +53,15 @@ namespace TimeScheduler.Model.Impl private void ReadListXml(string filePath) { - var xs = new XmlSerializer(typeof(List)); + //var xs = new XmlSerializer(typeof(List)); + var xs = new XmlSerializer(typeof(SimpleTimes)); using (var rd = new StreamReader(filePath)) - allItems_ = xs.Deserialize(rd) as List; + allItems_ = xs.Deserialize(rd) as SimpleTimes; } private void WriteListXml(string path) { - var xs = new XmlSerializer(typeof(List)); + //var xs = new XmlSerializer(typeof(List)); + var xs = new XmlSerializer(typeof(SimpleTimes)); using (StreamWriter wr = new StreamWriter(path)) xs.Serialize(wr, allItems_); } @@ -67,8 +69,8 @@ namespace TimeScheduler.Model.Impl private void Load() { ReadListXml(filename_); + lastKey_ = allItems_.Max(x => x.Key); } - private void Save() { var newFilename = filename_ + ".new"; @@ -79,13 +81,15 @@ namespace TimeScheduler.Model.Impl #endregion #region IDomain - public List GetItems(DateTime date) + IEnumerable IDomain.GetItems(DateTime date) { - var founded = allItems_.Where(x => x.From.Date == date); - return founded.Cast().ToList(); + return allItems_ + .Where(x => x.From.Date == date) + .OrderBy(x => x.From) + .Cast(); } - public Dictionary GetCostUnits() + Dictionary IDomain.GetCostUnits() { return new Dictionary { @@ -99,21 +103,24 @@ namespace TimeScheduler.Model.Impl }; } - public void ElementAdded(ITimeItem timeItem) + int IDomain.ElementAdded(ITimeItem timeItem) { - allItems_.Add((TimeItem)timeItem); + var ti = new TimeItem(timeItem); + ti.Key = ++lastKey_; + allItems_.Add(ti); + Save(); + return ti.Key; + } + void IDomain.ElementChanged(ITimeItem timeItem) + { + allItems_[timeItem.Key].Copy(timeItem); Save(); } - public void ElementChanged(ITimeItem timeItem) + void IDomain.ElementRemoved(ITimeItem timeItem) { - allItems_.Remove((TimeItem)timeItem); - allItems_.Add((TimeItem)timeItem); - Save(); - } - public void ElementRemoved(ITimeItem timeItem) - { - allItems_.Remove((TimeItem)timeItem); - Save(); + var removed = allItems_.Remove(timeItem.Key); + if (removed) + Save(); } #endregion } diff --git a/TimeScheduler/TimeScheduler/Domain/Impl/SimpleTimes.cs b/TimeScheduler/TimeScheduler/Domain/Impl/SimpleTimes.cs new file mode 100644 index 0000000..50058ec --- /dev/null +++ b/TimeScheduler/TimeScheduler/Domain/Impl/SimpleTimes.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections.ObjectModel; +using System.Xml; +using System.Xml.Schema; +using System.Xml.Serialization; + +namespace TimeScheduler.Domain.Impl +{ + /// Einfache Liste für die TimeItems + /// + /// Implementierung der Schittstelle für die Xml-Serialisierung, weil es sonst zu Schlüsseln Fehler kommt. + /// Implementierung von: http://weblogs.asp.net/pwelter34/444961 + /// + [Serializable] + [XmlRoot("SimpleTimes")] + public class SimpleTimes : KeyedCollection, IXmlSerializable + { + #region Konstruktor + /// Konstruktor + public SimpleTimes() { } + + /// + protected override int GetKeyForItem(TimeItem item) { return item.Key; } + #endregion + + #region IXmlSerializable + /// Schema ermitteln + /// null im Standard + public XmlSchema GetSchema() { return null; } + + /// Liest die Elemente aus dem XML-Stream + /// Der Steam-Leser + public void ReadXml(XmlReader reader) + { + + //var keySerializer = new XmlSerializer(typeof(int)); + var valueSerializer = new XmlSerializer(typeof(TimeItem)); + + var wasEmpty = reader.IsEmptyElement; + reader.Read(); + + if (wasEmpty) + return; + + while (reader.NodeType != XmlNodeType.EndElement) + { + reader.ReadStartElement("item"); + + //reader.ReadStartElement("key"); + //var key = (int)keySerializer.Deserialize(reader); + //reader.ReadEndElement(); + + reader.ReadStartElement("value"); + var value = (TimeItem)valueSerializer.Deserialize(reader); + reader.ReadEndElement(); + + Add(value); + + reader.ReadEndElement(); + reader.MoveToContent(); + } + reader.ReadEndElement(); + } + + /// Schreibt die Elemente in den XML-Stream + /// Der Stream-Schreiber + public void WriteXml(XmlWriter writer) + { + //var keySerializer = new XmlSerializer(typeof(int)); + var valueSerializer = new XmlSerializer(typeof(TimeItem)); + + foreach (var key in Dictionary.Keys) + { + writer.WriteStartElement("item"); + + //writer.WriteStartElement("key"); + //keySerializer.Serialize(writer, key); + //writer.WriteEndElement(); + + writer.WriteStartElement("value"); + var value = this[key]; + valueSerializer.Serialize(writer, value); + writer.WriteEndElement(); + + writer.WriteEndElement(); + } + } + #endregion + } +} diff --git a/TimeScheduler/TimeScheduler/Domain/Impl/TimeItem.cs b/TimeScheduler/TimeScheduler/Domain/Impl/TimeItem.cs index 55effe6..a686ef5 100644 --- a/TimeScheduler/TimeScheduler/Domain/Impl/TimeItem.cs +++ b/TimeScheduler/TimeScheduler/Domain/Impl/TimeItem.cs @@ -1,12 +1,11 @@ using System; using System.Runtime.Serialization; using TimeScheduler.Common; +using TimeScheduler.Model; -namespace TimeScheduler.Model.Impl +namespace TimeScheduler.Domain.Impl { - /// - /// - /// + /// Beinhaltet den Datenbestand eines Zeitelementes /// /// muss implementiert werden, damit die Daten über den BinarFormater serialisiert werden können. /// Für den XmlSerializer müsste die Klasse auf Public gestellt werden, was nicht immer gewünscht ist @@ -14,7 +13,32 @@ namespace TimeScheduler.Model.Impl [Serializable] public class TimeItem : NotifyableObject, ITimeItem//, ISerializable { - public TimeItem() { } + #region Konstruktion + /// Standard-Konstruktor + public TimeItem() { key_ = -1; } + + /// Konstruktor + /// Beschreibung + /// Von + /// Bis + /// Kostenstelle + /// Elementtyp + /// Schlüssel + public TimeItem(string description, DateTime from, DateTime till, int costUnit, TimeItemType itemType, int? key = null) : this() + { + description_ = description; + from_ = from; + till_ = till; + costUnit_ = costUnit; + itemType_ = itemType; + if (key.HasValue) + key_ = key.Value; + } + + /// Kopier-Konstruktor + /// Element von dem kopiert wird + public TimeItem(ITimeItem rhs) { Copy(rhs); Key = rhs.Key; } + #endregion //#region ISerializable //public TimeItem(SerializationInfo info, StreamingContext context) @@ -27,20 +51,42 @@ namespace TimeScheduler.Model.Impl //} //#endregion + #region Methoden + /// Kopiert die Werte der Eigenschaften auf diese Objekt, ohney Key + /// Objkt von em kopiert werden soll + public void Copy(ITimeItem rhs) + { + Description = rhs.Description; + From = rhs.From; + Till = rhs.Till; + CostUnit = rhs.CostUnit; + ItemType = rhs.ItemType; + } + #endregion + #region ITimeItem + private int key_; + /// + public int Key { get { return key_; } set { SetField(ref key_, value); } } + private string description_; + /// public string Description { get { return description_; } set { SetField(ref description_, value); } } private DateTime from_; + /// public DateTime From { get { return from_; } set { SetField(ref from_, value); } } private DateTime till_; + /// public DateTime Till { get { return till_; } set { SetField(ref till_, value); } } private int costUnit_; + /// public int CostUnit { get { return costUnit_; } set { SetField(ref costUnit_, value); } } private TimeItemType itemType_; + /// public TimeItemType ItemType { get { return itemType_; } set { SetField(ref itemType_, value); } } #endregion } diff --git a/TimeScheduler/TimeScheduler/MainWindow.xaml b/TimeScheduler/TimeScheduler/MainWindow.xaml index db784b7..bad02f2 100644 --- a/TimeScheduler/TimeScheduler/MainWindow.xaml +++ b/TimeScheduler/TimeScheduler/MainWindow.xaml @@ -6,7 +6,7 @@ xmlns:local="clr-namespace:TimeScheduler" xmlns:c="clr-namespace:TimeScheduler.Common" xmlns:vm="clr-namespace:TimeScheduler.ViewModel" - xmlns:domain="clr-namespace:TimeScheduler.Model.Impl" + xmlns:domain="clr-namespace:TimeScheduler.Domain.Impl" mc:Ignorable="d" Language="de" Title="TimeSchedule" Height="350" Width="525"> @@ -27,8 +27,7 @@ + ItemsSource="{Binding TimeItems}" SelectedItem="{Binding SelectedTimeItem}">