@startuml
package twisk {
    package exceptions {
        class ArcTwiskException {
            .. Constructeur ..
            + ArcTwiskException(String s)
            .. Autres méthodes ..
            + void afficherMessage()
        }

        class EtapeTwiskException {
            .. Constructeur ..
            + EtapeTwiskException(String s)
            .. Autres méthodes ..
            + void afficherMessage()
        }

        abstract class TwiskException {
            .. Constructeur ..
            + TwiskException(String s)
            .. Autres méthodes ..
            + {abstract} void afficherMessage()
        }
    }

    package mondeIG {
        class ActiviteIG {
            - int delai
            - int ecart

            .. Constructeur ..
            + ActiviteIG(String nom, String idf, int largeur, int hauteur)
            .. Getters ..
            + int getDelai()
            + int getEcart()
            .. Setters ..
            + void setDelai()
            + void setEcart()
        }

        class ArcIG {
            .. Constructeur ..
            + ArcIG(PointDeControleIG pt1, PointDeControleIG pt2)
            .. Getters ..
            + PointDeControleIG getPt1()
            + PointDeControleIG getPt2()
            + boolean isDoublon(PointDeControleIG pt1, PointDeControleIG pt2)
        }

        abstract class EtapeIG {
            # String nom
            # String identifiant
            # int posX
            # int posY
            # int largeur
            # int hauteur

            .. Constructeur ..
            + EtapeIG(String nom, String idf, int largeur, int hauteur)
            .. Getters ..
            + String getNom()
            + int getPosX()
            + int getPosY()
            + int getLargeur()
            + int getHauteur()
            + String getId()
            .. Setters ..
            + void setNom(String s)
            + void relocate(int x, int y)
            + void actualiserPointsDeControle()
            .. Autres méthodes ..
            + String toString()
            + Iterator<PointDeControleIG> iterator()
        }

        class MondeIG {
            .. Constructeur ..
            + MondeIG()
            .. Getters ..
            + getEtape(String id)
            + ArrayList<PointDeControleIG> getPointsControleSelectionnes()
            + ArrayList<EtapeIG> getEtapesSelectionnees()
            + boolean arcIsEmpty()
            + ArrayList<ArcIG> getArcsSelectionnees()
            + ArrayList<EtapeIG> getEntrees()
            + ArrayList<EtapeIG> getSorties()
            .. Setters ..
            + void ajouter(String type)
            + void ajouterArc(PointDeControleIG pt1, PointDeControleIG pt2)
            + void ajouterPointDeControle(PointDeControleIG c)
            + void reset()
            + void retirerDernierArc()
            + void selectionnerEtape(EtapeIG etape)
            + void supprimerSelection()
            + void renommerEtapesSelectionnees()
            + void setEntree()
            + void setSortie()
            + void setDelais()
            + void setEcarts()
            + void annulerSelectionEtapes()
            + void selectionnerArc(ArcIG arc)
            + void repositionnerEtape(String idEtape, int newPosX, int newPosY)
            .. Autres méthodes ..
            + Iterator<EtapeIG> iterator()
            + Iterator<ArcIG> iteratorArcs()
        }

        class PointDeControleIG {
            - int posX;
            - int posY;
            - String id;

            .. Constructeur ..
            + PointDeControleIG(int x, int y, EtapeIG etape)
            .. Getters ..
            + int getPosX()
            + int getPosY()
            + String getId()
            + String getIdEtape()
            .. Setter ..
            + void relocate(int x, int y)
            .. Autres méthodes ..
            + String toString()
        }

        class SujetObserve {
            .. Constructeur ..
            + SujetObserve()
            .. Setter ..
            + void ajouterObservateur(Observateur v)
            .. Autres méthodes ..
            + void notifierObservateurs()
        }
    }

    package outils {
        class FabriqueIdentifiant {
            - int noEtape
            - int noPointDeControle

            .. Constructeur ..
            - FabriqueIdentifiant()
            .. Getters ..
            + {static} FabriqueIdentifiant getInstance()
            + String getIdentifiantEtape()
            + String getIdentifiantPointDeControle(PointDeControleIG pt)
            .. Setter ..
            + void reset()
        }

        class TailleComposants {
            - int largeurActivite
            - int hauteurActivite

            .. Constructeur ..
            - TailleComposants()
            .. Getters ..
            + {static} TailleComposants getInstance()
            + int getLargeurActivite()
            + int getHauteurActivite()
        }
    }

    package vues {
        interface Observateur {
            {abstract} void reagir()
        }

        class VueActiviteIG {
            - HBox hBox

            .. Constructeur ..
            + VueActiviteIG(MondeIG monde, EtapeIG etape)
            .. Autres méthodes ..
            + void reagir()
        }

        class VueArcIG {
            - Line line;
            - Polyline triangle;

            .. Constructeur ..
            + VueArcIG(ArcIG arc, MondeIG monde)
            .. Getters ..
            + Line getLine()
            + Polyline getTriangle()
            .. Autres méthodes ..
            + void reagir()
        }

        abstract class VueEtapeIG {
            # Label titre

            .. Constructeur ..
            + VueEtapeIG(MondeIG monde, EtapeIG etape)
        }

        class VueMenu {
            .. Constructeur ..
            + VueMenu(MondeIG monde)
        }

        class VueMondeIG {
            .. Constructeur ..
            + VueMondeIG(MondeIG monde)
            .. Autres méthodes ..
            + void miseAJourPointsDeControles(EtapeIG e)
            + void miseAJourArcs()
            + void reagir()
        }

        class VueOutils {
            - Button boutonAjouter
            - Button boutonRetour
            - Button boutonEffacer

            .. Constructeur ..
            + VueOutils(MondeIG monde)
            .. Autres méthodes ..
            + void reagir()
        }

        class VuePointDeControleIG {
            .. Constructeur ..
            + VuePointDeControleIG(PointDeControleIG c, MondeIG m)
            .. Setter ..
            + void setColorCircle(Paint paint)
            .. Autres méthodes ..
            + void reagir()
        }
    }

    class Main {
    }
}
class Exception << (E, #FFFFFF) 🗲 >>
class Iterable

MondeIG --"*" EtapeIG
MondeIG --"1" TailleComposants
MondeIG --"*" ArcIG
MondeIG --"*" PointDeControleIG

PointDeControleIG --"1" EtapeIG

ArcIG --"2" PointDeControleIG

EtapeIG --"4" PointDeControleIG

SujetObserve --"*" Observateur

FabriqueIdentifiant --"static" FabriqueIdentifiant
TailleComposants --"static" TailleComposants

VueArcIG --"1" MondeIG
VueArcIG --"1" ArcIG

VueEtapeIG --"1" MondeIG
VueEtapeIG --"1" EtapeIG

VueMondeIG --"1" MondeIG

VueOutils --"1" MondeIG

VuePointDeControleIG --"1" MondeIG
VuePointDeControleIG --"1" PointDeControleIG

ArcTwiskException -up-|> TwiskException
EtapeTwiskException -up-|> TwiskException
TwiskException -up-|> Exception

ActiviteIG -up-|> EtapeIG
EtapeIG .up.|> Iterable
MondeIG -up-|> SujetObserve
MondeIG .up.|> Iterable

VueActiviteIG -up-|> VueEtapeIG
VueArcIG .up.|> Observateur
VueEtapeIG .up.|> Observateur
VueMondeIG .up.|> Observateur
VueOutils .up.|> Observateur
VuePointDeControleIG .up.|> Observateur
@enduml