123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990 |
- package graph;
- import java.awt.Color;
- import java.util.ArrayList;
- import org.eclipse.elk.graph.ElkConnectableShape;
- import org.eclipse.elk.graph.ElkEdge;
- import org.eclipse.elk.graph.ElkNode;
- import org.eclipse.emf.common.util.EList;
- import bk.LayoutType;
- import view.NodeView;
- /**
- * Die Implementation eines Knotens in einem Layered Graph.
- * Implementiert {@link LayeredGraphNode}.
- *
- * @author kolja
- *
- */
- public class LayeredNode implements LayeredGraphNode {
- private ElkNode original;
- private LayeredGraphNode parent;
- private boolean dummy;
-
- private class LayoutInfo
- {
- public double x;
- public double y;
- public double w;
- public double h;
- public Color color;
- public boolean selected;
- public boolean xUndef;
-
- // Block Calculation
- public LayeredGraphNode align;
- public LayeredGraphNode root;
- // Compaction
- public LayeredGraphNode sink;
- public double shift;
- private NodeView view;
- }
-
- private class CombinedLayoutInfo
- {
- public double x;
- public double y;
- public double w;
- public double h;
- public Color color;
- public boolean selected;
- private NodeView view;
- }
-
- private LayoutInfo[] layouts;
- private CombinedLayoutInfo combined;
- private String name;
-
- // for subgraph in this node
- private ArrayList< LayeredGraphEdge > edges;
- private ArrayList< LayeredGraphNode > nodes;
- private ArrayList< ArrayList< LayeredGraphNode > > layers;
-
- /**
- * Konvertiert einen Graph aus dem Elk format in einen Graph, der mehr Informationen enth�lt
- * @param n Der Graph, welcher konvertiert werden soll
- * @return Ein layered Graph, welcher im wesentlichen ein Wrapper f�r den urspr�nglichen Graphen ist
- */
- public static LayeredGraphNode convertToLayeredGraph( ElkNode n )
- {
- LayeredNode ln = new LayeredNode( n, null );
- for( ElkNode node : n.getChildren() )
- ln.addNode( convertToLayeredGraph( node ) );
- for( ElkEdge edge : n.getContainedEdges() )
- {
- // TODO n.getProperty(Properties.LAYERPOS) reads position of node n in his layer
- ArrayList< LayeredGraphNode > sources = new ArrayList<>();
- ArrayList< LayeredGraphNode > targets = new ArrayList<>();
- EList<ElkConnectableShape> s = edge.getSources();
- EList<ElkConnectableShape> t = edge.getTargets();
- for( ElkConnectableShape shape : s )
- sources.add( ln.findNodeFromOriginal( shape ) );
- for( ElkConnectableShape shape : t )
- targets.add( ln.findNodeFromOriginal( shape ) );
- ln.createEdge( edge, sources, targets );
- }
- return ln;
- }
-
- public LayeredNode( ElkNode original, LayeredGraphNode parent )
- {
- this.original = original;
- this.parent = parent;
-
- edges = new ArrayList<>();
- nodes = new ArrayList<>();
- layers = new ArrayList<>();
- layouts = new LayoutInfo[ 4 ];
- for( int i = 0; i < 4; i++ )
- layouts[ i ] = new LayoutInfo();
- int index = 0;
- for( LayoutInfo l : layouts )
- {
- if( original != null )
- {
- l.x = original.getX();
- l.y = original.getX();
- l.w = original.getWidth();
- l.h = original.getHeight();
- }
- l.align = this;
- l.root = this;
- l.sink = this;
- if( index == 0 || index == 2 )
- l.shift = Double.POSITIVE_INFINITY;
- else
- l.shift = Double.NEGATIVE_INFINITY;
- l.xUndef = true;
- index++;
- }
- dummy = false;
- combined = new CombinedLayoutInfo();
- if( original != null )
- {
- combined.x = original.getX();
- combined.y = original.getX();
- combined.w = original.getWidth();
- combined.h = original.getHeight();
- }
- combined.color = null;
- combined.selected = false;
- }
-
- public void setView( NodeView view, LayoutType layout )
- {
- if( layout == LayoutType.TOP_BOTTOM_LEFT )
- this.layouts[ 0 ].view = view;
- if( layout == LayoutType.TOP_BOTTOM_RIGHT )
- this.layouts[ 1 ].view = view;
- if( layout == LayoutType.BOTTOM_TOP_LEFT )
- this.layouts[ 2 ].view = view;
- if( layout == LayoutType.BOTTOM_TOP_RIGHT )
- this.layouts[ 3 ].view = view;
- if( layout == LayoutType.COMBINED )
- this.combined.view = view;
- }
-
- public NodeView getView( LayoutType layout )
- {
- if( layout == LayoutType.TOP_BOTTOM_LEFT )
- return layouts[ 0 ].view;
- if( layout == LayoutType.TOP_BOTTOM_RIGHT )
- return layouts[ 1 ].view;
- if( layout == LayoutType.BOTTOM_TOP_LEFT )
- return layouts[ 2 ].view;
- if( layout == LayoutType.BOTTOM_TOP_RIGHT )
- return layouts[ 3 ].view;
- if( layout == LayoutType.COMBINED )
- return combined.view;
- return null;
- }
-
- @Override
- public void setDummyNode( boolean dummy )
- {
- this.dummy = dummy;
- }
-
- @Override
- public boolean isDummyNode()
- {
- return dummy;
- }
- @Override
- public void setShift( double shift, LayoutType layout )
- {
- if( layout == null )
- {
- this.layouts[ 0 ].shift = shift;
- this.layouts[ 1 ].shift = shift;
- this.layouts[ 2 ].shift = shift;
- this.layouts[ 3 ].shift = shift;
- }
- if( layout == LayoutType.TOP_BOTTOM_LEFT )
- this.layouts[ 0 ].shift = shift;
- if( layout == LayoutType.TOP_BOTTOM_RIGHT )
- this.layouts[ 1 ].shift = shift;
- if( layout == LayoutType.BOTTOM_TOP_LEFT )
- this.layouts[ 2 ].shift = shift;
- if( layout == LayoutType.BOTTOM_TOP_RIGHT )
- this.layouts[ 3 ].shift = shift;
- }
-
- @Override
- public double getShift( LayoutType layout )
- {
- if( layout == LayoutType.TOP_BOTTOM_LEFT )
- return this.layouts[ 0 ].shift;
- if( layout == LayoutType.TOP_BOTTOM_RIGHT )
- return this.layouts[ 1 ].shift;
- if( layout == LayoutType.BOTTOM_TOP_LEFT )
- return this.layouts[ 2 ].shift;
- if( layout == LayoutType.BOTTOM_TOP_RIGHT )
- return this.layouts[ 3 ].shift;
- return 0;
- }
- @Override
- public void setSink( LayeredGraphNode sink, LayoutType layout )
- {
- if( layout == null )
- {
- this.layouts[ 0 ].sink = sink;
- this.layouts[ 1 ].sink = sink;
- this.layouts[ 2 ].sink = sink;
- this.layouts[ 3 ].sink = sink;
- }
- if( layout == LayoutType.TOP_BOTTOM_LEFT )
- this.layouts[ 0 ].sink = sink;
- if( layout == LayoutType.TOP_BOTTOM_RIGHT )
- this.layouts[ 1 ].sink = sink;
- if( layout == LayoutType.BOTTOM_TOP_LEFT )
- this.layouts[ 2 ].sink = sink;
- if( layout == LayoutType.BOTTOM_TOP_RIGHT )
- this.layouts[ 3 ].sink = sink;
- }
-
- @Override
- public LayeredGraphNode getSink( LayoutType layout )
- {
- if( layout == LayoutType.TOP_BOTTOM_LEFT )
- return this.layouts[ 0 ].sink;
- if( layout == LayoutType.TOP_BOTTOM_RIGHT )
- return this.layouts[ 1 ].sink;
- if( layout == LayoutType.BOTTOM_TOP_LEFT )
- return this.layouts[ 2 ].sink;
- if( layout == LayoutType.BOTTOM_TOP_RIGHT )
- return this.layouts[ 3 ].sink;
- return null;
- }
-
- @Override
- public boolean isXUndefined( LayoutType layout )
- {
- if( layout == LayoutType.TOP_BOTTOM_LEFT )
- return this.layouts[ 0 ].xUndef;
- if( layout == LayoutType.TOP_BOTTOM_RIGHT )
- return this.layouts[ 1 ].xUndef;
- if( layout == LayoutType.BOTTOM_TOP_LEFT )
- return this.layouts[ 2 ].xUndef;
- if( layout == LayoutType.BOTTOM_TOP_RIGHT )
- return this.layouts[ 3 ].xUndef;
- return true;
- }
- @Override
- public void setAlign( LayeredGraphNode align, LayoutType layout )
- {
- if( layout == null )
- {
- this.layouts[ 0 ].align = align;
- this.layouts[ 1 ].align = align;
- this.layouts[ 2 ].align = align;
- this.layouts[ 3 ].align = align;
- }
- if( layout == LayoutType.TOP_BOTTOM_LEFT )
- this.layouts[ 0 ].align = align;
- if( layout == LayoutType.TOP_BOTTOM_RIGHT )
- this.layouts[ 1 ].align = align;
- if( layout == LayoutType.BOTTOM_TOP_LEFT )
- this.layouts[ 2 ].align = align;
- if( layout == LayoutType.BOTTOM_TOP_RIGHT )
- this.layouts[ 3 ].align = align;
- }
- @Override
- public LayeredGraphNode getAlign( LayoutType layout )
- {
- if( layout == LayoutType.TOP_BOTTOM_LEFT )
- return this.layouts[ 0 ].align;
- if( layout == LayoutType.TOP_BOTTOM_RIGHT )
- return this.layouts[ 1 ].align;
- if( layout == LayoutType.BOTTOM_TOP_LEFT )
- return this.layouts[ 2 ].align;
- if( layout == LayoutType.BOTTOM_TOP_RIGHT )
- return this.layouts[ 3 ].align;
- return null;
- }
- @Override
- public void setRoot( LayeredGraphNode root, LayoutType layout )
- {
- if( layout == null )
- {
- this.layouts[ 0 ].root = root;
- this.layouts[ 1 ].root = root;
- this.layouts[ 2 ].root = root;
- this.layouts[ 3 ].root = root;
- }
- if( layout == LayoutType.TOP_BOTTOM_LEFT )
- this.layouts[ 0 ].root = root;
- if( layout == LayoutType.TOP_BOTTOM_RIGHT )
- this.layouts[ 1 ].root = root;
- if( layout == LayoutType.BOTTOM_TOP_LEFT )
- this.layouts[ 2 ].root = root;
- if( layout == LayoutType.BOTTOM_TOP_RIGHT )
- this.layouts[ 3 ].root = root;
- }
- @Override
- public LayeredGraphNode getRoot( LayoutType layout )
- {
- if( layout == LayoutType.TOP_BOTTOM_LEFT )
- return this.layouts[ 0 ].root;
- if( layout == LayoutType.TOP_BOTTOM_RIGHT )
- return this.layouts[ 1 ].root;
- if( layout == LayoutType.BOTTOM_TOP_LEFT )
- return this.layouts[ 2 ].root;
- if( layout == LayoutType.BOTTOM_TOP_RIGHT )
- return this.layouts[ 3 ].root;
- return null;
- }
- @Override
- public void setSelected( LayoutType layout )
- {
- if( layout == null )
- {
- this.layouts[ 0 ].selected = true;
- this.layouts[ 1 ].selected = true;
- this.layouts[ 2 ].selected = true;
- this.layouts[ 3 ].selected = true;
- combined.selected = true;
- }
- if( layout == LayoutType.TOP_BOTTOM_LEFT )
- this.layouts[ 0 ].selected = true;
- if( layout == LayoutType.TOP_BOTTOM_RIGHT )
- this.layouts[ 1 ].selected = true;
- if( layout == LayoutType.BOTTOM_TOP_LEFT )
- this.layouts[ 2 ].selected = true;
- if( layout == LayoutType.BOTTOM_TOP_RIGHT )
- this.layouts[ 3 ].selected = true;
- if( layout == LayoutType.COMBINED )
- combined.selected = true;
- }
-
- @Override
- public void unselectGraph()
- {
- for( LayeredGraphNode n : nodes)
- {
- n.unselectGraph();
- }
- this.layouts[ 0 ].selected = false;
- this.layouts[ 1 ].selected = false;
- this.layouts[ 2 ].selected = false;
- this.layouts[ 3 ].selected = false;
- combined.selected = false;
- }
- @Override
- public boolean isSelected( LayoutType layout )
- {
- if( layout == LayoutType.TOP_BOTTOM_LEFT )
- {
- boolean tmp = layouts[ 0 ].selected;
- layouts[ 0 ].selected = false;
- return tmp;
- }
- if( layout == LayoutType.TOP_BOTTOM_RIGHT )
- {
- boolean tmp = layouts[ 1 ].selected;
- layouts[ 1 ].selected = false;
- return tmp;
- }
- if( layout == LayoutType.BOTTOM_TOP_LEFT )
- {
- boolean tmp = layouts[ 2 ].selected;
- layouts[ 2 ].selected = false;
- return tmp;
- }
- if( layout == LayoutType.BOTTOM_TOP_RIGHT )
- {
- boolean tmp = layouts[ 3 ].selected;
- layouts[ 3 ].selected = false;
- return tmp;
- }
- if( layout == LayoutType.COMBINED )
- {
- boolean tmp = combined.selected;
- combined.selected = false;
- return tmp;
- }
- return false;
- }
-
- @Override
- public void setColor( Color c, LayoutType layout )
- {
- if( layout == null )
- {
- this.layouts[ 0 ].color = c;
- this.layouts[ 1 ].color = c;
- this.layouts[ 2 ].color = c;
- this.layouts[ 3 ].color = c;
- combined.color = c;
- }
- if( layout == LayoutType.TOP_BOTTOM_LEFT )
- this.layouts[ 0 ].color = c;
- if( layout == LayoutType.TOP_BOTTOM_RIGHT )
- this.layouts[ 1 ].color = c;
- if( layout == LayoutType.BOTTOM_TOP_LEFT )
- this.layouts[ 2 ].color = c;
- if( layout == LayoutType.BOTTOM_TOP_RIGHT )
- this.layouts[ 3 ].color = c;
- if( layout == LayoutType.COMBINED )
- combined.color = c;
- }
-
- private int calcClassSize( LayeredGraphNode sink, LayoutType layout )
- {
- if( parent == null )
- return 1;
- int ret = 0;
- for( LayeredGraphNode n : parent.getContainedNodes() )
- {
- if( n.getRoot( layout ).getSink( layout ) == sink )
- ret++;
- }
- return ret;
- }
-
- @Override
- public Color getClassColor( LayoutType layout )
- {
- if( layout == LayoutType.TOP_BOTTOM_LEFT && this.layouts[ 0 ].sink == this && calcClassSize( this, layout ) == 1 )
- return Color.LIGHT_GRAY;
- if( layout == LayoutType.TOP_BOTTOM_LEFT && this.layouts[ 0 ].sink == this )
- return this.layouts[ 0 ].color;
- else if( layout == LayoutType.TOP_BOTTOM_LEFT )
- return this.layouts[ 0 ].sink.getClassColor( layout );
- if( layout == LayoutType.TOP_BOTTOM_RIGHT && this.layouts[ 1 ].sink == this && calcClassSize( this, layout ) == 1 )
- return Color.LIGHT_GRAY;
- if( layout == LayoutType.TOP_BOTTOM_RIGHT && this.layouts[ 1 ].sink == this )
- return this.layouts[ 1 ].color;
- else if( layout == LayoutType.TOP_BOTTOM_RIGHT )
- return this.layouts[ 1 ].sink.getClassColor( layout );
- if( layout == LayoutType.BOTTOM_TOP_LEFT && this.layouts[ 2 ].sink == this && calcClassSize( this, layout ) == 1 )
- return Color.LIGHT_GRAY;
- if( layout == LayoutType.BOTTOM_TOP_LEFT && this.layouts[ 2 ].sink == this )
- return this.layouts[ 2 ].color;
- else if( layout == LayoutType.BOTTOM_TOP_LEFT )
- return this.layouts[ 2 ].sink.getClassColor( layout );
- if( layout == LayoutType.BOTTOM_TOP_RIGHT && this.layouts[ 3 ].sink == this && calcClassSize( this, layout ) == 1 )
- return Color.LIGHT_GRAY;
- if( layout == LayoutType.BOTTOM_TOP_RIGHT && this.layouts[ 3 ].sink == this )
- return this.layouts[ 3 ].color;
- else if( layout == LayoutType.BOTTOM_TOP_RIGHT )
- return this.layouts[ 3 ].sink.getClassColor( layout );
- if( layout == LayoutType.COMBINED )
- return combined.color;
- return null;
- }
-
- @Override
- public Color getColor( LayoutType layout )
- {
- if( layout == LayoutType.TOP_BOTTOM_LEFT && this.layouts[ 0 ].root == this && this.layouts[ 0 ].align == this )
- return Color.LIGHT_GRAY;
- if( layout == LayoutType.TOP_BOTTOM_LEFT && this.layouts[ 0 ].root != this )
- return this.layouts[ 0 ].root.getColor( layout );
- if( layout == LayoutType.TOP_BOTTOM_LEFT )
- return this.layouts[ 0 ].color;
- if( layout == LayoutType.TOP_BOTTOM_RIGHT && this.layouts[ 1 ].root == this && this.layouts[ 1 ].align == this )
- return Color.LIGHT_GRAY;
- if( layout == LayoutType.TOP_BOTTOM_RIGHT && this.layouts[ 1 ].root != this )
- return this.layouts[ 1 ].root.getColor( layout );
- if( layout == LayoutType.TOP_BOTTOM_RIGHT )
- return this.layouts[ 1 ].color;
- if( layout == LayoutType.BOTTOM_TOP_LEFT && this.layouts[ 2 ].root == this && this.layouts[ 2 ].align == this )
- return Color.LIGHT_GRAY;
- if( layout == LayoutType.BOTTOM_TOP_LEFT && this.layouts[ 2 ].root != this )
- return this.layouts[ 2 ].root.getColor( layout );
- if( layout == LayoutType.BOTTOM_TOP_LEFT )
- return this.layouts[ 2 ].color;
- if( layout == LayoutType.BOTTOM_TOP_RIGHT && this.layouts[ 3 ].root == this && this.layouts[ 3 ].align == this )
- return Color.LIGHT_GRAY;
- if( layout == LayoutType.BOTTOM_TOP_RIGHT && this.layouts[ 3 ].root != this )
- return this.layouts[ 3 ].root.getColor( layout );
- if( layout == LayoutType.BOTTOM_TOP_RIGHT )
- return this.layouts[ 3 ].color;
- if( layout == LayoutType.COMBINED )
- return combined.color;
- return null;
- }
-
- @Override
- public void setName( String n ) {
- name = n;
- }
-
- @Override
- public String getName()
- {
- return name;
- }
-
- @Override
- public ElkNode getOriginalNode() {
- return original;
- }
- @Override
- public void remove() {
- parent.removeNode( this );
- }
- @Override
- public LayeredGraphNode parent() {
- return parent;
- }
- @Override
- public void setLayer(int index) {
- parent.setNodeLayer( this, index );
- }
- @Override
- public int getLayer() {
- return parent.getNodeLayer( this );
- }
- @Override
- public void setX(double x, boolean def, LayoutType layout ) {
- if( layout == null )
- {
- layouts[ 0 ].x = x;
- layouts[ 1 ].x = x;
- layouts[ 2 ].x = x;
- layouts[ 3 ].x = x;
- combined.x = x;
- }
- if( layout == LayoutType.TOP_BOTTOM_LEFT )
- {
- layouts[ 0 ].xUndef = !def;
- layouts[ 0 ].x = x;
- }
- if( layout == LayoutType.TOP_BOTTOM_RIGHT )
- {
- layouts[ 1 ].xUndef = !def;
- layouts[ 1 ].x = x;
- }
- if( layout == LayoutType.BOTTOM_TOP_LEFT )
- {
- layouts[ 2 ].xUndef = !def;
- layouts[ 2 ].x = x;
- }
- if( layout == LayoutType.BOTTOM_TOP_RIGHT )
- {
- layouts[ 3 ].xUndef = !def;
- layouts[ 3 ].x = x;
- }
- if( layout == LayoutType.COMBINED )
- combined.x = x;
- }
- @Override
- public void setY(double y, LayoutType layout ) {
- if( layout == null )
- {
- layouts[ 0 ].y = y;
- layouts[ 1 ].y = y;
- layouts[ 2 ].y = y;
- layouts[ 3 ].y = y;
- combined.y = y;
- }
- if( layout == LayoutType.TOP_BOTTOM_LEFT )
- layouts[ 0 ].y = y;
- if( layout == LayoutType.TOP_BOTTOM_RIGHT )
- layouts[ 1 ].y = y;
- if( layout == LayoutType.BOTTOM_TOP_LEFT )
- layouts[ 2 ].y = y;
- if( layout == LayoutType.BOTTOM_TOP_RIGHT )
- layouts[ 3 ].y = y;
- if( layout == LayoutType.COMBINED )
- combined.y = y;
- }
- @Override
- public double getX( LayoutType layout ) {
- if( layout == LayoutType.TOP_BOTTOM_LEFT )
- return this.layouts[ 0 ].x;
- if( layout == LayoutType.TOP_BOTTOM_RIGHT )
- return this.layouts[ 1 ].x;
- if( layout == LayoutType.BOTTOM_TOP_LEFT )
- return this.layouts[ 2 ].x;
- if( layout == LayoutType.BOTTOM_TOP_RIGHT )
- return this.layouts[ 3 ].x;
- if( layout == LayoutType.COMBINED )
- return combined.x;
- return 0;
- }
- @Override
- public double getY( LayoutType layout ) {
- if( layout == LayoutType.TOP_BOTTOM_LEFT )
- return this.layouts[ 0 ].y;
- if( layout == LayoutType.TOP_BOTTOM_RIGHT )
- return this.layouts[ 1 ].y;
- if( layout == LayoutType.BOTTOM_TOP_LEFT )
- return this.layouts[ 2 ].y;
- if( layout == LayoutType.BOTTOM_TOP_RIGHT )
- return this.layouts[ 3 ].y;
- if( layout == LayoutType.COMBINED )
- return combined.y;
- return 0;
- }
- @Override
- public double getWidth( LayoutType layout ) {
- if( nodes.size() > 0 )
- {
- double max = 0;
- double min = Double.POSITIVE_INFINITY;
- for( LayeredGraphNode n : nodes )
- {
- if( max < n.getX(layout) + n.getWidth(layout) + 50 )
- max = n.getX(layout) + n.getWidth(layout) + 50;
- min = Math.min( n.getX(layout), min);
- }
- if( layout == LayoutType.TOP_BOTTOM_LEFT )
- return Math.max( max - min, layouts[ 0 ].w );
- if( layout == LayoutType.TOP_BOTTOM_RIGHT )
- return Math.max( max - min, layouts[ 1 ].w );
- if( layout == LayoutType.BOTTOM_TOP_LEFT )
- return Math.max( max - min, layouts[ 2 ].w );
- if( layout == LayoutType.BOTTOM_TOP_RIGHT )
- return Math.max( max - min, layouts[ 3 ].w );
- if( layout == LayoutType.COMBINED )
- return Math.max( max - min, combined.w );
- }
- if( layout == LayoutType.TOP_BOTTOM_LEFT )
- return layouts[ 0 ].w;
- if( layout == LayoutType.TOP_BOTTOM_RIGHT )
- return layouts[ 1 ].w;
- if( layout == LayoutType.BOTTOM_TOP_LEFT )
- return layouts[ 2 ].w;
- if( layout == LayoutType.BOTTOM_TOP_RIGHT )
- return layouts[ 3 ].w;
- if( layout == LayoutType.COMBINED )
- return combined.w;
- return 0;
- }
- @Override
- public double getHeight( LayoutType layout ) {
- if( nodes.size() > 0 )
- {
- double max = 0;
- for( LayeredGraphNode n : nodes )
- {
- if( max < n.getY(layout) + n.getHeight(layout) + 50 )
- max = n.getY(layout) + n.getHeight(layout) + 50;
- }
- if( layout == LayoutType.TOP_BOTTOM_LEFT )
- return Math.max( max, layouts[ 0 ].h );
- if( layout == LayoutType.TOP_BOTTOM_RIGHT )
- return Math.max( max, layouts[ 1 ].h );
- if( layout == LayoutType.BOTTOM_TOP_LEFT )
- return Math.max( max, layouts[ 2 ].h );
- if( layout == LayoutType.BOTTOM_TOP_RIGHT )
- return Math.max( max, layouts[ 3 ].h );
- if( layout == LayoutType.COMBINED )
- return Math.max( max, combined.h );
- }
- if( layout == LayoutType.TOP_BOTTOM_LEFT )
- return layouts[ 0 ].h;
- if( layout == LayoutType.TOP_BOTTOM_RIGHT )
- return layouts[ 1 ].h;
- if( layout == LayoutType.BOTTOM_TOP_LEFT )
- return layouts[ 2 ].h;
- if( layout == LayoutType.BOTTOM_TOP_RIGHT )
- return layouts[ 3 ].h;
- if( layout == LayoutType.COMBINED )
- return combined.h;
- return 0;
- }
-
- @Override
- public void setWidth( double w, LayoutType layout )
- {
- if( layout == null )
- {
- this.layouts[ 0 ].w = w;
- this.layouts[ 1 ].w = w;
- this.layouts[ 2 ].w = w;
- this.layouts[ 3 ].w = w;
- combined.w = w;
- }
- if( layout == LayoutType.TOP_BOTTOM_LEFT )
- this.layouts[ 0 ].w = w;
- if( layout == LayoutType.TOP_BOTTOM_RIGHT )
- this.layouts[ 1 ].w = w;
- if( layout == LayoutType.BOTTOM_TOP_LEFT )
- this.layouts[ 2 ].w = w;
- if( layout == LayoutType.BOTTOM_TOP_RIGHT )
- this.layouts[ 3 ].w = w;
- if( layout == LayoutType.COMBINED )
- combined.w = w;
- }
-
- @Override
- public void setHeight( double h, LayoutType layout )
- {
- if( layout == null )
- {
- this.layouts[ 0 ].h = h;
- this.layouts[ 1 ].h = h;
- this.layouts[ 2 ].h = h;
- this.layouts[ 3 ].h = h;
- combined.h = h;
- }
- if( layout == LayoutType.TOP_BOTTOM_LEFT )
- this.layouts[ 0 ].h = h;
- if( layout == LayoutType.TOP_BOTTOM_RIGHT )
- this.layouts[ 1 ].h = h;
- if( layout == LayoutType.BOTTOM_TOP_LEFT )
- this.layouts[ 2 ].h = h;
- if( layout == LayoutType.BOTTOM_TOP_RIGHT )
- this.layouts[ 3 ].h = h;
- if( layout == LayoutType.COMBINED )
- combined.h = h;
- }
- @Override
- public void removeEdge(LayeredGraphEdge e) {
- edges.remove( e );
- }
- @Override
- public void removeNode(LayeredGraphNode n) {
- for( LayeredGraphEdge e : n.getIncomingEdges() )
- e.remove();
- for( LayeredGraphEdge e : n.getOutgoingEdges() )
- e.remove();
- nodes.remove( n );
- for( ArrayList<LayeredGraphNode> l : layers )
- {
- l.remove( n );
- }
- }
- @Override
- public void setNodeLayer(LayeredGraphNode n, int index) {
- while( index >= layers.size() )
- layers.add( new ArrayList<>() );
- int old = n.getLayer();
- if( old >= 0 )
- layers.get( old ).remove( n );
- layers.get( index ).add( n );
- }
- @Override
- public void setOrderedLayer(ArrayList<Double> indizes, int layerIndex) {
- ArrayList<LayeredGraphNode> l2 = layers.get( layerIndex );
- ArrayList<LayeredGraphNode> result = new ArrayList<LayeredGraphNode>();
- while( indizes.size() > 0 )
- {
- int mIndex = 0;
- double min = indizes.get( 0 );
- for( int i = 1; i < indizes.size(); i++ )
- {
- if( min > indizes.get( i ) )
- {
- mIndex = i;
- min = indizes.get( i );
- }
- }
- result.add( l2.get( mIndex ) );
- l2.remove( mIndex );
- indizes.remove( mIndex );
- }
- layers.set( layerIndex, result );
- }
-
- @Override
- public ArrayList<LayeredGraphEdge> getOutgoingEdges() {
- return parent.getOutgoingEdges( this );
- }
-
- @Override
- public ArrayList<LayeredGraphEdge> getSortedOutgoingEdges() {
- return parent.getSortedOutgoingEdges( this );
- }
- @Override
- public ArrayList<LayeredGraphEdge> getIncomingEdges() {
- return parent.getIncomingEdges( this );
- }
- @Override
- public ArrayList<LayeredGraphEdge> getSortedIncomingEdges() {
- return parent.getSortedIncomingEdges( this );
- }
- @Override
- public ArrayList<LayeredGraphEdge> getContainedEdges() {
- return edges;
- }
- @Override
- public ArrayList<LayeredGraphNode> getContainedNodes() {
- return nodes;
- }
-
- @Override
- public ArrayList< LayeredGraphNode > getSortedContainedNodes()
- {
- ArrayList< LayeredGraphNode > result = new ArrayList<>();
- for( ArrayList<LayeredGraphNode> l : layers )
- {
- result.addAll( l );
- }
- return result;
- }
- @Override
- public ArrayList<ArrayList<LayeredGraphNode>> getContainedLayers() {
- return layers;
- }
- @Override
- public int getNodeLayer(LayeredGraphNode n) {
- for( int i = 0; i < layers.size(); i++ )
- {
- if( layers.get( i ).contains( n ) )
- return i;
- }
- return -1;
- }
- @Override
- public ArrayList<LayeredGraphEdge> getOutgoingEdges(LayeredGraphNode n) {
- ArrayList<LayeredGraphEdge> result = new ArrayList<>();
- for( LayeredGraphEdge e : edges )
- {
- if( e.getSources().contains( n ) && !result.contains( e ) )
- result.add( e );
- }
- return result;
- }
- @Override
- public ArrayList<LayeredGraphEdge> getIncomingEdges(LayeredGraphNode n) {
- ArrayList<LayeredGraphEdge> result = new ArrayList<>();
- for( LayeredGraphEdge e : edges )
- {
- if( e.getTargets().contains( n ) && !result.contains( e ) )
- result.add( e );
- }
- return result;
- }
- @Override
- public ArrayList<LayeredGraphEdge> getSortedOutgoingEdges(LayeredGraphNode n) {
- ArrayList<LayeredGraphEdge> result = new ArrayList<>();
- if( n.getLayer() + 1 >= layers.size() )
- return result;
- ArrayList< LayeredGraphEdge > unsorted = getOutgoingEdges( n );
- for( LayeredGraphNode node : layers.get( n.getLayer() + 1 ) )
- {
- for( LayeredGraphEdge e : unsorted )
- {
- if( e.getTargets().contains( node ) && !result.contains( e ) )
- result.add( e );
- }
- }
- return result;
- }
- @Override
- public ArrayList<LayeredGraphEdge> getSortedIncomingEdges(LayeredGraphNode n) {
- ArrayList<LayeredGraphEdge> result = new ArrayList<>();
- if( n.getLayer() - 1 < 0 )
- return result;
- ArrayList< LayeredGraphEdge > unsorted = getIncomingEdges( n );
- for( LayeredGraphNode node : layers.get( n.getLayer() - 1 ) )
- {
- for( LayeredGraphEdge e : unsorted )
- {
- if( e.getSources().contains( node ) && !result.contains( e ) )
- result.add( e );
- }
- }
- return result;
- }
-
- @Override
- public LayeredGraphEdge findEdgeBetween( LayeredGraphNode source, LayeredGraphNode target )
- {
- for( LayeredGraphEdge e : edges )
- {
- if( e.getSources().contains( source ) && e.getTargets().contains( target ) )
- return e;
- }
- return null;
- }
- @Override
- public LayeredGraphNode createNode(ElkNode original) {
- LayeredGraphNode n = new LayeredNode( original, this );
- nodes.add( n );
- return n;
- }
- @Override
- public LayeredGraphEdge createEdge(ElkEdge original, ArrayList<LayeredGraphNode> sources, ArrayList<LayeredGraphNode> targets) {
- LayeredGraphEdge e = new LayeredEdge( original, sources, targets, this );
- edges.add( e );
- return e;
- }
- @Override
- public LayeredGraphEdge createSimpleEdge(ElkEdge original, LayeredGraphNode source, LayeredGraphNode target) {
- ArrayList<LayeredGraphNode> sources = new ArrayList<>();
- ArrayList<LayeredGraphNode> targets = new ArrayList<>();
- sources.add( source );
- targets.add( target );
- LayeredGraphEdge e = new LayeredEdge( original, sources, targets, this );
- edges.add( e );
- return e;
- }
-
- @Override
- public LayeredGraphEdge findEdgeFromOriginal(Object original) {
- for( LayeredGraphEdge e : edges )
- {
- if( e.getOriginalEdge() == original )
- return e;
- }
- return null;
- }
- @Override
- public LayeredGraphNode findNodeFromOriginal(Object original) {
- for( LayeredGraphNode n : nodes )
- {
- if( n.getOriginalNode() == original )
- return n;
- }
- return null;
- }
-
- @Override
- public LayeredGraphNode findNodeByName( String name )
- {
- for( LayeredGraphNode n : nodes )
- {
- if( n.getName() != null && name != null && n.getName().equals( name ) )
- return n;
- }
- return null;
- }
- @Override
- public void addNode(LayeredGraphNode n) {
- nodes.add( n );
- n.setParent( this );
- }
- @Override
- public void addEdge(LayeredGraphEdge e) {
- edges.add( e );
- e.setGraph( this );
- }
- @Override
- public void setParent(LayeredGraphNode parent) {
- this.parent = parent;
- }
-
- @Override
- public String toString() {
- if( name != null )
- return name;
- return "unnamed node";
- }
- }
|