Dokumentation zur Serialisierung des FlowDiagramModels
======================================================

Die Ablaufdiagramme müssen gespeichert und wiederhergestellt werden können. Dazu wird
das FlowDiagramModel und die ControlElements serialisiert bzw. deserialisiert. Das ist
allerdings nicht ganz einfach aus folgenden Gründen:

1.) Das Model allein reicht nicht, um das FlowDiagram wieder komplett herzustellen; es
    fehlen die Positionen der Steuerelemente, die logischerweise nicht im Model, sondern
    in der View (ControlElementComponent) gespeichert werden.
2.) Listener können im Allgemeinen nicht serialisiert werden und sind deshalb futsch. Das
    heißt sie müssen neu erzeugt und registriert werden.

Das wurde wie folgt gelöst:

Speichern
---------
Mit einem ObjectOutputStream wird zuerst ganz primitiv das FlowDiagramModel serialisiert,
und dann aber in der selben Datei direkt hinter dem Model eine ArrayList mit den
Positionen (LocationList) der Steuerelemente. Diese Liste bekommt man durch Aufruf der
Methode FlowDiagram.generateLocationList().

Den ganzen Speichervorgang erledigt allein MainFrame mit private boolean saveFlowDiagrams().

Öffnen
------
Mit einem ObjectInputStream wird zuerst das FlowDiagramModel und dann die Liste mit den
Positionen (LocationList) eingelesen. Das reicht aber noch lange nicht, um ein fertiges
Ablaufdiagramm vor sich zu haben.

Das FlowDiagramModel muss wegen 2.) wiederhergestellt werden. Das geht mit der static-
Methode von FlowDiagramModel restoreDeserialized(FlowDiagramModel deserialized). Damit
werden beim Argument "deserialized" die nötigen Änderungen/Ergänzungen durchgeführt.
Genauer: Die - zunächst leere - Liste der FlowDiagramModelListener wird erstellt; Der
Listener für die zugehörigen ControlElements wird erstellt; Jedes zugehöriges
ControlElement wiederhergestellt und der ControlElementListener des FlowDiagramModels
wird registriert.

Die Wiederherstellung der ControlElements wird mit einer static-Methode von
ControlElement, die auch restoreDeserialized() heißt - allerdings ein ControlElement
als Argument erwartet - , realisiert. Diese erstellt lediglich die (zunächst leere) Liste
für die ControlElementListener (eigentlich nur einen, nämlich den vom FlowDiagramModel).

Jetzt haben wir ein komplett wiederhergestelltes FlowDiagramModel, das allerdings in noch
keinem FlowDiagram angezeigt wird. Zuletzt wird das Model beim FlowDiagram (View) als
Model gesetzt mit setModel().

setModel() gibt es in zwei überladenen Versionen: Einmal mit, einmal ohne LocationList.
Wenn keine LocationList angegeben wird erhalten die Steuerelemente einfach die Standard-
Position, ähnlich wie wenn man mehrere Windows-Explorer hintereinander öffnet. Ansonsten
eben die gespeicherte Positionen.

Bevor aber die Positionen gesetzt werden wird ein sequentielles Erstellen des FlowDiagrams
simuliert: Zuerst werden alle ControlElements hinzugefügt, dann die Pfade erstellt und
zuletzt das Root-ControlElement gesetzt. Natürlich wird im Model nichts geändert - das ist
ja schon fertig! Aber beim MVC-Konzept wird ja die View über Änderungen im Model informiert,
woraufhin sie die Anzeige aktualisiert. Da es aber ja keine Änderungen im Model gibt, weils
schon fertig ist, wird das eben simuliert.

Das ist eigentlich ein Kapitel für sich, gehört aber auch hier dazu. Das MVC-Konzept ist
in der Dokumentation dazu nochmal erklärt.

Für weitere Fragen dazu, siehe Javadoc und Code-Comments.