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}">