Aby dodać do CASTa nowy algorytm rozmieszczenia węzłów, należy wykonać dwa duże kroki. Pierwszy z nich to napisanie samego algorytmu, a drugi - podpięcie algorytmu pod GUI CASTa.
Każdy algorytm rozkładu węzłów powinien implementować interfejs pl.edu.agh.cast.schema.layout.algorith.ILayoutAlgorithm, który znajduje się w pluginie pl.edu.agh.cast.schema (należy go dodać do zależności (dependencies) tworzonego pluginu). Interfejs ten definiuje metodę layoutNodes, używaną do rozmieszczania elementów. Metoda ta dla podanej kolekcji obiektów typu pl.edu.agh.cast.model.visual.Node uruchamia algorytm, który wywołuje na tych obiektach metodę setLocation w celu ustawienia ich położenia.
W celu uproszczenia tworzenia algorytmów, zdefiniowane zostały dwie abstrakcyjne klasy: pl.edu.agh.cast.schema.layout.algorithm.AbstractLayoutAlgorithm i pl.edu.agh.cast.schema.layout.algorithm.AbstractGroupingLayoutAlgorithm. Zaleca się, aby nowe algorytmy rozszerzały jedną z tych dwóch klas.
AbstractLayoutAlgorithm dostarcza finalnej implementacji metody layoutNodes, która bierze pod uwagę stary środek ciężkości elementów. Klasa ta definiuje abstrakcyjną metodę setNodesPositions, która jest wywoływana do ułożenia elementów. Już po ułożeniu elementów przez setNodesPositions są one przemieszczane tak, aby ich środek ciężkości pokrywał się ze starym środkiem. Dodatkowo AbstractLayoutAlgorithm zapewnia też, że żaden z elementów nie zostanie przesunięty poza lewą oraz górną krawędź diagramu.
AbstractGroupingLayoutAlgorithm rozszerza AbstractLayoutAlgorithm i dostarcza dodatkowo metod pomocniczych dla algorytmów, które używają grupowania elementów (zapewne większość algorytmów będzie tego wymagała). Dostarcza on następujące metody:
Algorytmy operują na kolekcjach obiektów typu Node, i tylko na nich. Najważniejsze metody klasy Node z punktu widzenia algorytmów:
Połączenia między węzłami są opisywane przez obiekty typu pl.edu.agh.cast.model.visual.ConnectionGroup. Każdy Node posiada dwie kolekcje połączeń: przychodzących i wychodzących. Połączenia przychodzące to takie, dla których getTarget jest danym węzłem, zaś wychodzące - dla których getSource jest danym węzłem. W każdym połaczeniu dodatkowo znajduje się liczba połączeń wychodzących i przychodzących wykonanych z drugim węzłem.
Dla jasności, jeśli A zadzwonił do B 4 razy, a B do A 3 razy, to węzły te będą miały następujące obiekty ConnectionGroup:
Wpięcie algorytmu do GUI następuje wedle następujących kroków:
action class="pl.edu.agh.cast.action.layout.SetPeacockLayoutAction" icon="icons/pl/edu/agh/cast/icons/menu/diagram/x.gif" id="pl.edu.agh.cast.menu.diagram.peacocklayout.action" label="%action.label.10" menubarPath="diagram/schema" style="push" toolbarPath="diagram/schema"/
przy czym należy zmienić odpowiednio atrybuty class, id, label.
Wpięcie algorytmu do GUI poprzez plugin następuje wedle następujących kroków:
1. Klasa samego algorytmu, która rozszerza klasę AbstractLayoutAlgorithm? 2. Klasa akcji odpalanej po naciśnięciu przycisku, która rozszerza SetLayoutAction?
extension point="org.eclipse.ui.editorActions" editorContribution id="pl.edu.agh.cast.schema.setlayout" targetID="pl.edu.agh.cast.diagrams.schema.SchemaDiagramEditor" action class="klasa.rozszerzajaca.klase.SetLayoutAction" id="unikalny.identyfikator.naszej.akcji" label="nazwa.na.przyciku" menubarPath="diagram/schema" style="push" toolbarPath="diagram/schema" /action /editorContribution /extension