LayeredEdge.java 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. package Model;
  2. import java.awt.Point;
  3. import java.util.ArrayList;
  4. import org.eclipse.elk.graph.ElkEdge;
  5. /**
  6. * Die Implementation einer Kante aus einem Layered Graphen
  7. *
  8. * @author kolja
  9. *
  10. */
  11. public class LayeredEdge implements LayeredGraphEdge {
  12. ElkEdge original;
  13. ArrayList< LayeredGraphNode > sources;
  14. ArrayList< LayeredGraphNode > targets;
  15. LayeredGraphNode graph;
  16. boolean reversed;
  17. boolean dummy;
  18. ArrayList< Point > bindPoints;
  19. public LayeredEdge( ElkEdge original, ArrayList< LayeredGraphNode > sources, ArrayList< LayeredGraphNode > targets, LayeredGraphNode graph )
  20. {
  21. this.original = original;
  22. this.sources = sources;
  23. this.targets = targets;
  24. this.graph = graph;
  25. reversed = false;
  26. dummy = false;
  27. bindPoints = new ArrayList<>();
  28. bindPoints.add( null );
  29. bindPoints.add( null );
  30. }
  31. @Override
  32. public void setStartPoint( int x, int y )
  33. {
  34. bindPoints.set( 0, new Point( x, y ) );
  35. }
  36. @Override
  37. public void addBindPoint( int x, int y )
  38. {
  39. bindPoints.add( bindPoints.size() - 1, new Point( x, y ) );
  40. }
  41. @Override
  42. public void setEndPoint( int x, int y )
  43. {
  44. bindPoints.set( bindPoints.size() - 1, new Point( x, y ) );
  45. }
  46. @Override
  47. public ArrayList<Point> getLinePoints()
  48. {
  49. //if( bindPoints.get( 0 ) == null && sources.size() > 0 )
  50. //{
  51. setStartPoint( (int)sources.get( 0 ).getX() + (int)sources.get( 0 ).getWidth() / 2, (int)sources.get( 0 ).getY() + (int)sources.get( 0 ).getHeight() );
  52. //}
  53. //if( bindPoints.get( bindPoints.size() - 1 ) == null && targets.size() > 0 )
  54. //{
  55. setEndPoint( (int)targets.get( 0 ).getX() + (int)targets.get( 0 ).getWidth() / 2, (int)targets.get( 0 ).getY() );
  56. //}
  57. return bindPoints;
  58. }
  59. @Override
  60. public ElkEdge getOriginalEdge() {
  61. return original;
  62. }
  63. @Override
  64. public void remove() {
  65. graph.removeEdge( this );
  66. }
  67. @Override
  68. public ArrayList<LayeredGraphNode> getSources() {
  69. return sources;
  70. }
  71. @Override
  72. public ArrayList<LayeredGraphNode> getTargets() {
  73. return targets;
  74. }
  75. @Override
  76. public boolean isCrossLayerEdge() {
  77. int sl = sources.get( 0 ).getLayer();
  78. for( LayeredGraphNode s : sources )
  79. {
  80. if( sl != s.getLayer() )
  81. return true;
  82. }
  83. int tl = targets.get( 0 ).getLayer();
  84. if( Math.abs( tl - sl ) != 1 )
  85. return true;
  86. for( LayeredGraphNode t : targets )
  87. {
  88. if( tl != t.getLayer() )
  89. return true;
  90. }
  91. return false;
  92. }
  93. @Override
  94. public void replaceByDummyNodes() {
  95. if( isCrossLayerEdge() )
  96. {
  97. remove();
  98. if( sources.size() == 1 && targets.size() == 1 )
  99. {
  100. LayeredGraphNode last = sources.get( 0 );
  101. int sl = last.getLayer();
  102. int tl = targets.get( 0 ).getLayer();
  103. for( int i = sl + 1; i < tl; i++ )
  104. {
  105. LayeredGraphNode n = graph.createNode( null );
  106. n.setLayer( i );
  107. LayeredGraphEdge e = graph.createSimpleEdge( original, last, n );
  108. e.setDummyEdge();
  109. if( reversed )
  110. e.setReversedEdge();
  111. last = n;
  112. }
  113. LayeredGraphEdge e = graph.createSimpleEdge( original, last, targets.get( 0 ) );
  114. e.setDummyEdge();
  115. if( reversed )
  116. e.setReversedEdge();
  117. }
  118. }
  119. }
  120. @Override
  121. public void reverse() {
  122. reversed = !reversed;
  123. ArrayList< LayeredGraphNode > tmp = sources;
  124. sources = targets;
  125. targets = tmp;
  126. }
  127. @Override
  128. public boolean isDummyEdge() {
  129. return dummy;
  130. }
  131. @Override
  132. public void removeDummyNodes() {
  133. if( isDummyEdge() )
  134. {
  135. remove();
  136. ArrayList< LayeredGraphNode > sours = sources;
  137. for( int i = 0; i < sours.size(); i++ )
  138. {
  139. LayeredGraphNode n = sours.get( i );
  140. if( n.getOriginalNode() == null )
  141. {
  142. sours.remove( n );
  143. for( LayeredGraphEdge e : n.getIncomingEdges() )
  144. {
  145. if( e.isDummyEdge() && e.getOriginalEdge() == original )
  146. sours.addAll( e.getSources() );
  147. }
  148. }
  149. }
  150. ArrayList< LayeredGraphNode > targs = targets;
  151. for( int i = 0; i < targs.size(); i++ )
  152. {
  153. LayeredGraphNode n = targs.get( i );
  154. if( n.getOriginalNode() == null )
  155. {
  156. targs.remove( n );
  157. for( LayeredGraphEdge e : n.getOutgoingEdges() )
  158. {
  159. if( e.isDummyEdge() && e.getOriginalEdge() == original )
  160. targs.addAll( e.getTargets() );
  161. }
  162. }
  163. }
  164. LayeredGraphEdge e = graph.createEdge( original, sours, targs );
  165. if( reversed )
  166. e.setReversedEdge();
  167. }
  168. }
  169. @Override
  170. public void setDummyEdge() {
  171. dummy = true;
  172. }
  173. @Override
  174. public void setReversedEdge() {
  175. reversed = true;
  176. }
  177. @Override
  178. public void setGraph(LayeredGraphNode graph) {
  179. this.graph = graph;
  180. }
  181. @Override
  182. public boolean isReversedEdge() {
  183. return reversed;
  184. }
  185. }