 package graph;

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

import org.eclipse.elk.graph.ElkEdge;

import bk.LayoutType;

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

    /**
     * Gibt die originale Kante des Elk Graphen zur�ck
     * @return Gibt die originale Kante des Elk Graphen zur�ck
     */
    public ElkEdge getOriginalEdge();
    
    /**
     * Checks whether the edge has been marked as conflicted in the given layout.
     * @param layout the layout to check
     * @return whether the edge has been marked as conflicted in the given layout
     */
    public boolean isConflicted( LayoutType layout );
    
    /**
     * Computes a list of edges that cross this edge.
     * @return the list.
     */
    public ArrayList<LayeredGraphEdge> calcEdgeCrossings();
    
    /**
     * Mark this edge as conflicted in the given layout.
     * @param conflicted Whether to mark the edge as conflicted or to remove this mark.
     * @param layout the layout
     */
    public void setConflicted( boolean conflicted, LayoutType layout );
    /**
     * Entfernt diese Kante vom Graphen
     */
    public void remove();
    /**
     * Gibt eine Liste mit Knoten zur�ck, von welchen die Kante beginnt
     * @return Liste mit Startknoten
     */
    public ArrayList< LayeredGraphNode > getSources();
    /**
     * Gibt eine Liste mit Knoten zur�ck, bei welchen die Kante endet
     * @return Liste mit Endknoten
     */
    public ArrayList< LayeredGraphNode > getTargets();
    /**
     * Pr�ft, ob die Kante �ber mehrere Layer hinweg geht
     * @return true, falls die Kante �ber mehrere Layer hinweg geht
     */
    public 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
     */
    public void replaceByDummyNodes();
    /**
     * Dreht die Kante um, indem die Startknoten mit den Endknoten getauscht werden
     */
    public void reverse();
    /**
     * Set the starting point of this edge in the given layout.
     * @param x the x coordinate of the starting point
     * @param y the y coordinate of the starting point
     * @param layout the layout
     */
    public void setStartPoint( int x, int y, LayoutType layout );
    /**
     * Set the ending point of this edge in the given layout.
     * @param x the x coordinate of the ending point
     * @param y the y coordinate of the ending point
     * @param layout the layout
     */
    public void setEndPoint( int x, int y, LayoutType layout );
    /**
     * Adds a bend point for this edge in the given layout.
     * @param x the x coordinate of the bend point
     * @param y the y coordinate of the bend point
     * @param layout the layout
     */
    public void addBindPoint( int x, int y, LayoutType layout );
    /**
     * Get the list of bend points of this edge in the given layout.
     * @param layout the layout
     * @return the list
     */
    public ArrayList<Point> getLinePoints( LayoutType layout );
    /**
     * Pr�ft, ob die Kante umgedreht wurde
     * @return true, falls die Kante umgedreht wurde
     */
    public 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
     */
    public 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
     */
    public void removeDummyNodes();
    /**
     * Legt fest, dass es sich bei dieser Kante um eine Dummykante handelt
     */
    public void setDummyEdge();
    /**
     * Legt fest, dass es sich bei dieser Kante um eine umgedrehte Kante handelt
     */
    public void setReversedEdge();
    /**
     * Legt den Graphen fest, zu dem diese Kante geh�rt
     * @param graph Der Graph, zu dem die Kante geh�rt
     */
    public void setGraph( LayeredGraphNode graph );
}
