 package Model;

import java.awt.Point;
import java.util.ArrayList;

import org.eclipse.elk.graph.ElkEdge;

import Algorithms.Animated.BK.ExtremalLayoutCalc.LayoutType;

/**
 * Ein Interface, welches die Methoden einer Kante aus einem gelayerten Graphen beschreibt
 * @author kolja
 *
 */
public interface LayeredGraphEdge {

    /**
     * @return Gibt die originale Kante des Elk Graphen zur�ck
     */
    ElkEdge getOriginalEdge();
    
    
    public boolean isConflicted( LayoutType layout );
    public ArrayList<LayeredGraphEdge> calcConflictedEdges();
    public void setConflicted( boolean conflicted, LayoutType layout );
    /**
     * Entfernt diese Kante vom Graphen
     */
    void remove();
    /**
     * Gibt eine Liste mit Knoten zur�ck, von welchen die Kante beginnt
     * @return Liste mit Startknoten
     */
    ArrayList< LayeredGraphNode > getSources();
    /**
     * Gibt eine Liste mit Knoten zur�ck, bei welchen die Kante endet
     * @return Liste mit Endknoten
     */
    ArrayList< LayeredGraphNode > getTargets();
    /**
     * Pr�ft, ob die Kante �ber mehrere Layer hinweg geht
     * @return true, falls die Kante �ber mehrere Layer hinweg geht
     */
    boolean isCrossLayerEdge();
    /**
     * F�r jeden Layer �ber den die Kante geht wird ein Dummy Node erzeugt.
     * Diese werden durch Dummy Kanten verbunden, welche diese Kante ersetzen.
     * Die Kante wird automatisch aus dem Graphen entfernt
     */
    void replaceByDummyNodes();
    /**
     * Dreht die Kante um, indem die Startknoten mit den Endknoten getauscht werden
     */
    void reverse();
    
    void setStartPoint( int x, int y, LayoutType layout );
    void setEndPoint( int x, int y, LayoutType layout );
    void addBindPoint( int x, int y, LayoutType layout );
    ArrayList<Point> getLinePoints( LayoutType layout );
    /**
     * Pr�ft, ob die Kante umgedreht wurde
     * @return true, falls die Kante umgedreht wurde
     */
    boolean isReversedEdge();
    /**
     * Pr�ft, ob die Kante eine Dummy Kante ist (also ob sie von einem Dummy Knoten startet oder zu einem DummyKnoten hinf�hrt)
     * @return true, falls die Kante eine Dummy Kante ist
     */
    boolean isDummyEdge();
    /**
     * Ermittelt, welche f�r welche originale Kante diese Kante als Dummykante eingesetzt wurd
     * und entfernt all die Dummynodes und Dummykanten wieder. Anschlie�end wird die alte Kante wieder zum Graphen hinzugef�gt
     */
    void removeDummyNodes();
    /**
     * Legt fest, dass es sich bei dieser Kante um eine Dummykante handelt
     */
    void setDummyEdge();
    /**
     * Legt fest, dass es sich bei dieser Kante um eine umgedrehte Kante handelt
     */
    void setReversedEdge();
    /**
     * Legt den Graphen fest, zu dem diese Kante geh�rt
     * @param graph Der Graph, zu dem die Kante geh�rt
     */
    void setGraph( LayeredGraphNode graph );
}
