You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

326 lines
11 KiB

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.Serialization;
using System.Text;
namespace notre_bibliotheque
{
/// <summary>
/// cette classe va permettre à l'utilisateur de voir toutes les informations concernant un langage
/// elle implémente l'interface Item, IEquatable<Langage> (pour le protocole d'égalité) ainsi que
/// INotifyPropertyChanged
/// </summary>
[DataContract]
public class Langage : Item, IEquatable<Langage>, INotifyPropertyChanged
{
//un langage a un nom de type string
private string nom;
[DataMember]
public string Nom
{
get => nom;
set
{
if (String.IsNullOrEmpty(value.Trim()))
{
throw new Exception("Le nom doit être renseigné");
}
nom = value;
}
}
//un langage a une date de création de type int (juste l'année)
private int dateDuLangage;
[DataMember]
public int DateDuLangage
{
get => dateDuLangage;
set
{
if(value <= 1900)
{
throw new Exception("La date de création doit être renseigné");
}
dateDuLangage = value;
}
}
//un langage a une collection d'auteurs de type IList<string>
private IList<string> lesAuteurs;
[DataMember]
public IList<string> LesAuteurs
{
get => lesAuteurs;
set
{
if(value == null)
{
throw new Exception("Les auteurs ne doivent pas être null");
}
if(value.Count == 0)
{
throw new Exception("Il doit y avoir au moins un auteur");
}
foreach(string auteur in value)
{
if (String.IsNullOrEmpty(auteur.Trim()))
{
throw new Exception("Le nom de l'auteur doit être renseigné");
}
}
lesAuteurs = value;
}
}
//un langage a un lien vers sa documentation de type string
private string documentation;
[DataMember]
public string Documentation
{
get => documentation;
set
{
if (String.IsNullOrEmpty(value.Trim()))
{
throw new Exception("La documentation doit être renseigné");
}
documentation = value;
}
}
//un langage a un chemin pour son logo de type string
private string cheminDuLogo;
[DataMember]
public string CheminDuLogo
{
get => cheminDuLogo;
set
{
if (String.IsNullOrEmpty(value.Trim()))
{
throw new Exception("le chemin du logo doit être renseigné");
}
cheminDuLogo = value;
}
}
//un langage a une collection de logiciels connus de type IList<string>
private IList<string> logicielsConnus;
[DataMember]
public IList<string> LogicielsConus
{
get => logicielsConnus;
set
{
if (value == null)
{
throw new Exception("Les logiciels ne doivent pas être null");
}
if (value.Count == 0)
{
throw new Exception("Il doit y avoir au moins un logiciel");
}
foreach (string logiciel in value)
{
if (String.IsNullOrEmpty(logiciel.Trim()))
{
throw new Exception("Le nom du logiciel doit être renseigné");
}
}
logicielsConnus = value;
}
}
//un langage a une description de son utilité de type string
private string utilitéDuLangage;
[DataMember]
public string UtilitéDuLangage
{
get => utilitéDuLangage;
set
{
if (String.IsNullOrEmpty(value.Trim()))
{
throw new Exception("l'utilité du langage doit être renseigné");
}
utilitéDuLangage = value;
}
}
//un langage a un exemple de code "Hello World" de type string
private string exempleDeCode;
[DataMember]
public string ExempleDeCode
{
get => exempleDeCode;
set
{
if (String.IsNullOrEmpty(value.Trim()))
{
throw new Exception("l'exemple de code doit être renseigné");
}
exempleDeCode = value;
}
}
//un langage a une collection de paradigmes de type IList<string>
private IList<string> lesParadigmes;
[DataMember]
public IList<string> LesParadigmes
{
get => lesParadigmes;
set
{
if (value == null)
{
throw new Exception("Les paradigmes ne doivent pas être null");
}
if (value.Count == 0)
{
throw new Exception("Il doit y avoir au moins un paradigme");
}
foreach (string parag in value)
{
if (String.IsNullOrEmpty(parag.Trim()))
{
throw new Exception("Le nom du paradigme doit être renseigné");
}
}
lesParadigmes = value;
}
}
//un langage a une génération de type int
int generation;
[DataMember]
public int Generation
{
get => generation;
set
{
if (value <= 0)
{
throw new ArgumentException("La génération doit être suppérieur a 0");
}
generation = value;
}
}
//la propriété DansLesFavoris de type bool indique si le langage sélectionné par l'utilisateur
//est actuellement dans la liste des favoris du compte de l'utilisateur (si celui-ci est connecté)
//elle invoque l'événeiment PropertyChanged quand sa valeur est set
private bool dansLesFavoris;
public bool DansLesFavoris
{
get => dansLesFavoris;
set
{
dansLesFavoris = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("DansLesFavoris"));
}
}
//l'événement PropertyChanged est utilisé par la propriété DansLesFavoris, pour notifier à l'ensemble
//du programme quand cette propriété est set
public event PropertyChangedEventHandler PropertyChanged;
//cette classe a deux constructeurs
/// <summary>
/// ce premier constructeur ne prend aucun parametres, les propriétés du langages ne sont alors pas set
/// (ce constructeur a surtout été utile pour les tests)
/// </summary>
public Langage() { }
/// <summary>
/// ce second constructeur prend en parametres toutes les informations necessaires pour créer un langage
/// les propriétés du langage vont alors etre set par toutes ses valeurs données en parametre
/// (sauf pour DansLesFavoris qui est mis à false quand le langage est créé)
/// </summary>
/// <param name="nom"></param>
/// <param name="date"></param>
/// <param name="auteurs"></param>
/// <param name="doc"></param>
/// <param name="logo"></param>
/// <param name="exemple"></param>
/// <param name="logiciels"></param>
/// <param name="utilite"></param>
/// <param name="paradigmes"></param>
/// <param name="generation"></param>
public Langage(string nom, int date, IList<string> auteurs, string doc, string logo, string exemple, IList<string> logiciels, string utilite, IList<string> paradigmes, int generation)
{
Nom = nom;
DateDuLangage = date;
LesAuteurs = auteurs;
Documentation = doc;
CheminDuLogo = logo;
LogicielsConus = logiciels;
UtilitéDuLangage = utilite;
ExempleDeCode = exemple;
LesParadigmes = paradigmes;
Generation = generation;
DansLesFavoris = false;
}
/// <summary>
/// la methode ToString permet d'afficher les différentes informations d'un langage
/// </summary>
/// <returns></returns>
public override string ToString()
{
string affiche_auteurs = null;
string affiche_logiciels = null;
string affiche_paradigme = "";
foreach(string auteur in LesAuteurs)
{
affiche_auteurs += $"{auteur} \n";
}
foreach(string logiciel in LogicielsConus)
{
affiche_logiciels += $"{logiciel} \n";
}
foreach(string paradigme in LesParadigmes)
{
affiche_paradigme += $"{paradigme} \n";
}
return $"Nom du langage = {Nom} \n Date de création = {DateDuLangage} \n Auteurs = {affiche_auteurs} \n Documentation = {Documentation} \n " +
$"Logo = {CheminDuLogo} \n Paradigmes = {affiche_paradigme}\n Logiciels Connus = {affiche_logiciels} \n Utilité du langage = {UtilitéDuLangage} \n Exemple de code (Hello World) = {ExempleDeCode}\n Génération = {Generation}";
}
/// <summary>
/// ces trois methodes servent à redéfinir protocole d'égalité
/// deux langages sont les mêmes si ils ont le même nom
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public override bool Equals(object obj)
{
if (obj == null) return false;
if (this == obj) return true;
if (this.GetType() != obj.GetType()) return false;
return Equals(obj as Langage);
}
public bool Equals(Langage other)
{
return this.Nom == other.Nom;
}
public override int GetHashCode()
{
return ((Nom.Length + DateDuLangage) * LesAuteurs.Count) / 3;
}
}
}