Commit b23c7212 authored by Alexander Scharfenberg's avatar Alexander Scharfenberg
Browse files

commenting classes and windows

parent 46306ddc
......@@ -4,8 +4,28 @@ using System.Windows;
namespace Raumverwaltung_HMWK
{
/**
* <summary>
* Eine AddAssetWindow-Instanz wird über ein Room-Window erstellt, nachdem "Asset hinzufügen" ausgewählt wird.
* Das Fenster stellt ein Eingabe-Feld bereit, wobei über die Bestätigung mit "OK" ein neues Asset mit eindeutiger ID
* angelegt wird. Der Name des Assets kann variabel festgelegt werden.
*
* </summary>
*/
public partial class AddAssetWindow : Window
{
/**
* <param name="RoomId">
* wird dem AddAssetWindow übergeben, um dem potentiell neuem Asset die Raum-Id zu hinterlegen
* </param>
* <param name="Assets">
* ist die angezeigte Asset-Liste für den spezifischen Raum bzw. das Room-Window. Die Liste wird übergeben, damit
* jedes Hinzufügen eines Assets Diese aktualisiert.
* </param>
*
*/
private int RoomId;
private ObservableCollection<Asset> Assets;
public AddAssetWindow(int roomId, ObservableCollection<Asset> observableCollection)
......@@ -20,7 +40,7 @@ namespace Raumverwaltung_HMWK
if (!String.IsNullOrEmpty(Assetinput.Text))
{
string assetName = Assetinput.Text;
//insert Asset
//füge das Asset in die SqLite-Datenbanktabelle "Asset" mit einer eindeutigen Id, einem Namen sowie einer Raum-Id ein.
SqLiteDataAccess.InsertAsset(RoomId,assetName);
Assets.Add(new Asset(SqLiteDataAccess.LatestAssetId(),assetName,RoomId));
......
......@@ -6,17 +6,41 @@ using Microsoft.Win32;
namespace Raumverwaltung_HMWK
{
/**
* <summary>
* Öffnet sich beim Anlegen eines neuen Stockwerks aus dem Main-Window heraus über den Reiter "Stockwerk-Anlegen".
* Einem ausgewählten Standort kann ein Stockwerk hinzugefügt werden.
* </summary>
*/
public partial class AddFloorWindow : Window
{
/**
* <param name="buildings">
* Alle Standorte, die zum Zeitpunkt der Auswahl des Menüpunkts "Stockwerk-Anlegen" verfügbar sind.
* </param>
*/
private List<Building> buildings;
public AddFloorWindow()
{
InitializeComponent();
//die Liste wird mit allen aktuellen Standorten aus der Datenbank befüllt
buildings = SqLiteDataAccess.GetLocations();
StandortSelection.ItemsSource = buildings;
}
/**
* <summary>
* Bezieht den Namen des neuen Stockwerks, den ausgewählten Standort sowie das ausgewählte Bild.
* Die Standortwahl sowie der Name sind Pflichtfelder, jedoch muss kein Bild ausgewählt werden.
* Der Pfad des Bilds wird so angepasst, dass Dieser relativ ist. Das Bild **muss** aus dem Image-Ordner ausgewählt werden,
* ansonsten schlägt die Auswahl fehl.
* </summary>
*/
private void AddFloor(object sender, RoutedEventArgs e)
{
string Floorname = StockwerkInput.Text;
......@@ -26,6 +50,8 @@ namespace Raumverwaltung_HMWK
if (!String.IsNullOrEmpty(Floorname) && StandortSelection.SelectedItem != null)
{
Building selected = buildings[StandortSelection.SelectedIndex];
// zu dem ausgewählten Standort werden alle Stockwerke geladen um zu überprüfen, ob es diesen Stockwerkbezeichner
// bereits gibt.
List<Floor> existingFloors = SqLiteDataAccess.GetFloorsToBuilding(selected);
bool found = false;
for (int i = 0; i < existingFloors.Count; i++)
......@@ -40,6 +66,8 @@ namespace Raumverwaltung_HMWK
{
if (Imagepath == "" || Imagepath.Contains("Images"))
{
// Falls kein Image ausgwählt wurde oder das Image aus dem Images-Ordner stammt, kann das Stock-
//werk angelegt werden.
SqLiteDataAccess.AddFloor(Floorname,Imagepath,selected);
MessageBox.Show("Stockwerk angelegt!", "Erfolgreich:", MessageBoxButton.OK,
......@@ -83,11 +111,18 @@ namespace Raumverwaltung_HMWK
{
Close();
}
/**
* <summary>
* Über den Button "Suchen" wird die Funktion aufgerufen. Nur .png-Bilder werden im File-Dialog für den User
* zur Auswahl angezeigt. Die Bildsuche beginnt im Images-Ordner, aus welchem ausschließlich die Bilder verwendet werden sollen.
* </summary>
*/
private void SearchFile(object sender, RoutedEventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
//Filterung der Files
openFileDialog.Filter = "Image Files|*.png;*.PNG";
//Setzen des Startordners bei der Suche
string CombinedPath = Path.Combine(Directory.GetCurrentDirectory(), "../../Images");
openFileDialog.InitialDirectory = Path.GetFullPath(CombinedPath);
if (openFileDialog.ShowDialog() == true)
......
......@@ -4,8 +4,16 @@ using System.Windows;
namespace Raumverwaltung_HMWK
{
/**
* <summary>
* Ein neuer Standort kann hinzugefügt werden. Alle Namen der Standorte müssen eindeutig sein. Kein Name sowie ein
* belegter Name gelten als ungültige Eingaben.
* </summary>
*/
public partial class AddLocationWindow : Window
{
public AddLocationWindow()
{
InitializeComponent();
......
......@@ -3,8 +3,31 @@ using System.Windows;
namespace Raumverwaltung_HMWK
{
/**
* <summary>
* Dieses Fenster kann geöffnet werden, indem ein beliebiges Floor-Window und der Reiter "Raum-Anlegen" ausgewählt wurde.
* Der anzulegende Raum wird der Stockwerk-Instanz hinzugefügt, welche im Floor-Window hinterlegt ist, sodass er sich
* immer an der Stockwerkinstanz orientiert.
* </summary>
*/
public partial class AddRoomWindow : Window
{
/**
* <param name="name">
* Der Name des gewünschten Raums. Er muss global eindeutig sein (über alle Standorte hinaus).
* </param>
* <param name="grösse">
* Die Raumgröße in Quadratmetern gemessen. Der Faktor ist wichtig bei der Entscheidung der Arbeitsplätze pro Raum.
* </param>
* <param name="arbeitsplätze">
* Ein festzusetzender Wert für die Anzahl der Arbeitsplätze. Er bestimmt die Obergrenze. Anhand der Größe werden
* die Buttons und die Farbkästen in der Übersicht gefärbt.
* </param>
* <param name="floorId">
* Die Stockwerk-Id, die vom Floor-Window mit übergeben wird, um den gewünschten Raum dem richtigen Stockwerk zuzuordnen.
* </param>
*/
private string name;
private double grösse;
private int arbeitsplätze;
......@@ -27,6 +50,7 @@ namespace Raumverwaltung_HMWK
name = RaumName.Text;
grösse = Double.Parse(Größe.Text);
arbeitsplätze = Int32.Parse(Arbeitsplätze.Text);
// Der Raum wird mit den gelisteten Parametern in die Tabelle "Room" eingefügt.
SqLiteDataAccess.AddRoom(name, grösse, arbeitsplätze, floorId);
MessageBox.Show("Raum angelegt!", "Erfolgreich:", MessageBoxButton.OK, MessageBoxImage.Information);
foreach (Window w in Application.Current.Windows)
......
......@@ -5,9 +5,26 @@ using System.Windows;
namespace Raumverwaltung_HMWK
{
/**
* <summary>
* Dieses Fenster öffnet sich nur über ein zuvor geöffnetes Room-Window über den Button "Benutzer hinzufügen".
* Über dieses Fenster können existierende Nutzer dem ausgewählten Raum hinzugefügt werden.
* </summary>
*/
public partial class AddUserForRoomWindow : Window
{
/**
* <param name="userList">
* die Liste mit den bereits vorhandenen Nutzern in dem ausgewählten Raum. Dies ist eine ObservableCollection,
* damit die Liste nach dem Hinzufügen automatisch aktualisiert wird, sodass auch die Einfärbung dynamisch funktioniert.
* </param>
* <param name="users">
* die Liste mit allen Nutzern, die noch nicht dem Raum zugeordnet sind, sodass keine Nutzer doppelt hinzugefügt werden können.
* </param>
* <param name="RoomId">
* die Raum-ID, sodass eine Relation Room_User erstellt werden kann.
* </param>
*/
private ObservableCollection<User> userList;
private List<User> users;
private int RoomId;
......@@ -16,8 +33,8 @@ namespace Raumverwaltung_HMWK
{
InitializeComponent();
RoomId = roomId;
// Alle Nutzer (egal ob bereits im Raum oder nicht) werden geladen.
users = SqLiteDataAccess.LoadUsers();
//updating UserList from RoomWindow
userList = observableCollection;
......@@ -53,6 +70,7 @@ namespace Raumverwaltung_HMWK
{
User selectedUser = users[AllUsers.SelectedIndex];
// Die ID des ausgewählten Nutzers sowie die Raum-Id werden verwendet, um eine Room_User-Relation zu erstellen
SqLiteDataAccess.RoomUserRelation(RoomId,selectedUser.Id);
userList.Add(selectedUser);
MessageBox.Show("Benutzer wurde hinzugefügt", "Erfolgreich:", MessageBoxButton.OK,
......
......@@ -4,6 +4,14 @@ using System.Windows;
namespace Raumverwaltung_HMWK
{
/**
* <summary>
* Über den Reiter "Benutzer-Anlegen" des Main-Windows öffnet sich dieses Fenster. Hierbei wird ein neuer Benutzer
* angelegt. Dieser bekommt eine eindeutige Id sowie einen Vornamen & Nachnamen, dessen Felder befüllt werden müssen.
* Zusätzlich können die Felder Abteilung, Referat, Orga sowie Telefonnummer ausgefüllt werden.
* </summary>
*/
public partial class AddUserWindow : Window
{
public AddUserWindow()
......@@ -24,6 +32,7 @@ namespace Raumverwaltung_HMWK
if (!String.IsNullOrEmpty(username) && !String.IsNullOrEmpty(vorname))
{
//Lade alle angelegten Nutzer
List<User> users = SqLiteDataAccess.LoadUsers();
bool found = false;
for (int i = 0; i < users.Count; i++)
......@@ -38,6 +47,7 @@ namespace Raumverwaltung_HMWK
{
try
{
// Falls es den Nutzer mit dem gewünschten Namen & Vornamen nicht gibt, kann er erstellt werden
SqLiteDataAccess.AddUser(username, vorname, department, referat, orga, number);
MessageBox.Show("Nutzer wurde angelegt!", "Erfolgreich:", MessageBoxButton.OK,
MessageBoxImage.Information);
......
namespace Raumverwaltung_HMWK
{
/// <summary>
/// Interaction logic for App.xaml
/// Diese Klasse wird benötigt um die Applikation als ganzes Starten zu können. In der ganzen Anwendung wird kein
/// App-Fenster geöffnet, da es sich bei der Instanz um einen "Container" für alle anderen Fenster handelt.
/// </summary>
public partial class App
{
......
......@@ -2,41 +2,65 @@
namespace Raumverwaltung_HMWK
{
/**
* <summary>
* Ein Asset ist ein Vermögenswert des HMWK, so kann es zum Anlagevermögen gehören und einen Drucker, Telefonanschluss,
* Bildschirm oder PC abbilden. Sie können zu Räumen hinzugefügt und persistiert werden. Bei der Bezeichnung der Assets
* gibt es keine Beschränkungen, sodass auch die Namen nicht eindeutig sein müssen. Ein Asset kann nicht ohne Raum existieren.
* Wird ein Raum gelöscht, so wird auch das hinterlegte Asset gelöscht.
* </summary>
*/
public class Asset
{
/**
* <param name="AId">
* eindeutige Asset-ID
* </param>
* <param name="AName">
* der Name des Assets
* </param>
*
* <param name="RId">
* die Raum-ID, zu der das Asset gehört
* </param>
*
*/
private int AId;
private string AName;
private int RId;
// Standardkonstruktor: WICHTIG für die Datenbank, da SqLite einen leeren Konstruktor benötigt für das Casting
public Asset()
{
}
// Konstruktor für die Anwendung: Ein Asset wird direkt über eine eindeutige Id, einen Namen sowie einer Raum-Id erstellt
public Asset(int id,string aName, int rId)
{
AId = id;
AName = aName;
RId = rId;
}
// getter/setter
public int aId
{
get { return AId; }
set { AId = value; }
}
//getter/setter
public string aName
{
get { return AName; }
set { AName = value; }
}
//getter/setter
public int rId
{
get { return RId; }
set { RId = value; }
}
// ToString wird überschrieben für eine saubere Formatierung: Jedes Asset wird über seinen Namen angezeigt.
public override string ToString()
{
return AName;
......
......@@ -2,38 +2,67 @@
namespace Raumverwaltung_HMWK
{
/**
* <summary>
* In der Anwendung sind Building, Gebäude, Standort sowie Location Synonyme. Hierbei handelt es sich um ein Objekt mit einer
* Liste an Stockwerken, die wiederum eine Liste an Räumen beinhalten. Jedes Building hat eine eindeutige Id, einen eindeutigen Namen
* sowie eine Liste an Floor-Objekten.
*
* In der Anwendung wird nicht immer zwangsläufig ein Building-Datensatz 1:1 in ein Building-Objekt gecastet. Vielmehr gilt die
* Klasse als Container und zum Herauslesen der Spalten in der Datenbank-Relation.
*
* </summary>
*/
public class Building
{
/**
* <param name="BId">
* eindeutige ID für ein Building
* </param>
* <param name="bname">
* eindeutiger Name für jedes Building, keine Beschränkungen bei den Eingabezeichen.
* </param>
* <param name="floors">
* Liste mit Floor-Objekten
* </param>
*/
private int bId;
private string bname;
private List<Floor> floors = new List<Floor>();
// Standardkonstruktor: WICHTIG für die Datenbank, da SqLite einen leeren Konstruktor benötigt für das Casten
// mit einem Building-Objekt.
public Building()
{
}
// Konstruktor für die Anwendung: Jedes Building wird über einen eindeutigen Namen erstellt.
public Building(string name)
{
this.bname = name;
}
// setter/getter für BId
public int BId
{
get { return bId; }
set { bId = value; }
}
// setter/getter für BName
public string BName
{
get { return bname; }
set { bname = value; }
}
// setter/getter für Floors
public List<Floor> Floors
{
get { return floors; }
set { floors = value; }
}
//ToString Funktion: sorgt für eine vernünftige Formatierung: Wenn ein Building-Objekt angezeigt werden soll,
//wird der Name des Building angegeben
public override string ToString()
{
return bname;
......
......@@ -5,18 +5,33 @@ using System.Windows.Controls;
namespace Raumverwaltung_HMWK
{
/**
* <summary>
* Über den Reiter "Benutzer-Ändern" können bei einem bereits angelegten Nutzer bestimmte Attribute geändert werden.
* Zu den änderbaren Attributen zählen "Vorname, Nachname, Abteilung, Referat, Orga, Telefonnummer".
* </summary>
*/
public partial class ChangeUserWindow : Window
{
/**
* <param name="users">
* alle bereits angelegten Nutzer
* </param>
*/
private List<User> users;
public ChangeUserWindow()
{
// Lade alle Nutzer und stelle Sie über die ComboBox zur Verfügung
users = SqLiteDataAccess.LoadUsers();
InitializeComponent();
AllUsers.ItemsSource = users;
}
/*
* setze die Textfelder entsprechend des selektierten Nutzers
*/
private void AllUsers_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
......@@ -27,10 +42,12 @@ namespace Raumverwaltung_HMWK
ReferatInput.Text = selected.Referat;
OrgaInput.Text = selected.Orga;
NumberInput.Text = selected.Number;
}
/*
* Falls die Änderung nicht dazu führt, dass ein Nutzer doppelt vorhanden ist, wird die Änderung durchgeführt.
*/
private void ChangeUser(object sender, RoutedEventArgs e)
{
if (!String.IsNullOrEmpty(NameInput.Text) && !String.IsNullOrEmpty(VorNameInput.Text))
......@@ -42,32 +59,44 @@ namespace Raumverwaltung_HMWK
{
case MessageBoxResult.Yes:
{
try
if (userExists(NameInput.Text, VorNameInput.Text))
{
MessageBox.Show("Benutzer existiert bereits mit diesem Vor- und Nachnamen", "Fehler",
MessageBoxButton.OK, MessageBoxImage.Error);
}
else
{
SqLiteDataAccess.ChangeUser(NameInput.Text, VorNameInput.Text, DepartmentInput.Text,
ReferatInput.Text, OrgaInput.Text, NumberInput.Text, users[AllUsers.SelectedIndex].Id);
MessageBox.Show("Änderung durchgeführt", "Erfolgreich:", MessageBoxButton.OK,
MessageBoxImage.Information);
foreach (Window w in Application.Current.Windows)
try
{
if (w.Title != "Raumverwaltung-HMWK")
{
w.Close();
}
else
SqLiteDataAccess.ChangeUser(NameInput.Text, VorNameInput.Text, DepartmentInput.Text,
ReferatInput.Text, OrgaInput.Text, NumberInput.Text,
users[AllUsers.SelectedIndex].Id);
MessageBox.Show("Änderung durchgeführt", "Erfolgreich:", MessageBoxButton.OK,
MessageBoxImage.Information);
foreach (Window w in Application.Current.Windows)
{
w.Close();
MainWindow window = new MainWindow();
window.Show();
if (w.Title != "Raumverwaltung-HMWK")
{
w.Close();
}
else
{
w.Close();
MainWindow window = new MainWindow();
window.Show();
}
}
}
catch (Exception)
{
MessageBox.Show("Die Änderung hat leider nicht geklappt", "Fehler:",
MessageBoxButton.OK,
MessageBoxImage.Error);
}
}
catch (Exception)
{
MessageBox.Show("Die Änderung hat leider nicht geklappt", "Fehler:", MessageBoxButton.OK,
MessageBoxImage.Error);
}
break;
}
case MessageBoxResult.No:
......@@ -89,5 +118,22 @@ namespace Raumverwaltung_HMWK
{
Close();
}
/*
* Überprüfung, ob der Nutzer mit dem vergebenen Namen und Vornamen existiert
*/
private bool userExists(string name, string vorname)
{
bool found = false;
for (int i = 0; i < users.Count; i++)
{
if (users[i].Nachnname.Equals(name) && users[i].Vorname.Equals(vorname))
{
found = true;
}
}
return found;
}
}
}
\ No newline at end of file
......@@ -5,14 +5,32 @@ using System.Windows.Controls;
namespace Raumverwaltung_HMWK
{
/**
* <summary>
* Über den Reiter "Stockwerk-Löschen" im MainWindow wird eine DeleteFloorWindow-Instanz erstellt. Diese wird für das
* Löschen eines Stockwerks verwendet. Je nach Standort wird eine Combo-Box mit auswählbaren Stockwerken befüllt. Wenn
* ein Stockwerk gelöscht wird, werden alle dazugehörigen Räume, Raum-Nutzer Beziehungen und Assets zu dem Stockwerk
* gelöscht.
* </summary>
*/
public partial class DeleteFloorWindow : Window
{
/**
* <param name="buildings">
* alle zur Verfügung stehenden Standorte
* </param>
* <param name="floors">
* Stockwerkliste, die mit den passenden Stockwerken, je nach Standort, befüllt wird
* </param>
*/
private List<Building> buildings;
private List<Floor> floors = new List<Floor>();
public DeleteFloorWindow()
{
InitializeComponent();
// befülle die Standortliste mit den Building-Einträgen der SqLite-Datenbank
buildings = SqLiteDataAccess.GetLocations();
LocationSelection.ItemsSource = buildings;
LocationSelection.SelectedIndex = 0;
......@@ -27,8 +45,6 @@ namespace Raumverwaltung_HMWK
{
if (FloorSelection.SelectedItem != null)
{
MessageBoxResult result = MessageBox.Show("Möchten Sie das Stockwerk löschen?", "Achtung:",
MessageBoxButton.YesNo, MessageBoxImage.Question);
switch (result)
......@@ -38,6 +54,7 @@ namespace Raumverwaltung_HMWK
try
{
Floor selected = floors[FloorSelection.SelectedIndex];
// Lösche das Stockwerk mit der hinterlegten Id
SqLiteDataAccess.DeleteFloor(selected.Id);
MessageBox.Show("Stockwerk wurde gelöscht!", "Erfolgreich:", MessageBoxButton.OK,
MessageBoxImage.Information);
......@@ -78,13 +95,19 @@ namespace Raumverwaltung_HMWK
}
/**
* <summary>
* Die angezeigte Liste sowie die Hintergrundliste der Stockwerke muss gepflegt werden, je nachdem für welchen
* Standort sich der User entscheidet. Bei jedem Wechsel der Auswahl müssen die Listen resetet werden, da
* ansonsten die neuen Stockwerke jedigliche der Liste hinzugefügt werden, wenn der Nutzer seine Auswahl ändert.
* </summary>
*/
private void LocationSelection_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
floors.Clear();
FloorSelection.ItemsSource = null;
FloorSelection.ItemsSource = SqLiteDataAccess.GetFloorsToBuilding(buildings[LocationSelection.SelectedIndex]);
floors = SqLiteDataAccess.GetFloorsToBuilding(buildings[LocationSelection.SelectedIndex]);
}
}
}
\ No newline at end of file
......@@ -4,8 +4,20 @@ using System.Windows;
namespace Raumverwaltung_HMWK
{