LayeredNode.java 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775
  1. package Model;
  2. import java.awt.Color;
  3. import java.util.ArrayList;
  4. import javax.swing.SwingUtilities;
  5. import org.eclipse.elk.graph.ElkEdge;
  6. import org.eclipse.elk.graph.ElkNode;
  7. import Algorithms.Animated.BK.ExtremalLayoutCalc.LayoutType;
  8. import View.MainView;
  9. /**
  10. * Die Implementation eines Knotens in einem Layered Graph.
  11. * Implementiert {@link LayeredGraphNode.}
  12. *
  13. * @author kolja
  14. *
  15. */
  16. public class LayeredNode implements LayeredGraphNode {
  17. // for this node
  18. private ElkNode original;
  19. private LayeredGraphNode parent;
  20. private class LayoutInfo
  21. {
  22. public double x;
  23. public double y;
  24. public double w;
  25. public double h;
  26. public Color color;
  27. public boolean selected;
  28. public boolean xUndef;
  29. // Block Calculation
  30. public LayeredGraphNode align;
  31. public LayeredGraphNode root;
  32. // Compaction
  33. public LayeredGraphNode sink;
  34. public double shift;
  35. }
  36. LayoutInfo[] layouts;
  37. String name;
  38. // for subgraph in this node
  39. private ArrayList< LayeredGraphEdge > edges;
  40. private ArrayList< LayeredGraphNode > nodes;
  41. private ArrayList< ArrayList< LayeredGraphNode > > layers;
  42. public LayeredNode( ElkNode original, LayeredGraphNode parent )
  43. {
  44. this.original = original;
  45. this.parent = parent;
  46. edges = new ArrayList<>();
  47. nodes = new ArrayList<>();
  48. layers = new ArrayList<>();
  49. layouts = new LayoutInfo[ 4 ];
  50. for( int i = 0; i < 4; i++ )
  51. layouts[ i ] = new LayoutInfo();
  52. for( LayoutInfo l : layouts )
  53. {
  54. if( original != null )
  55. {
  56. l.x = original.getX();
  57. l.y = original.getX();
  58. l.w = original.getWidth();
  59. l.h = original.getHeight();
  60. }
  61. l.align = this;
  62. l.root = this;
  63. l.sink = this;
  64. l.shift = Double.POSITIVE_INFINITY;
  65. l.xUndef = true;
  66. }
  67. }
  68. @Override
  69. public void setShift( double shift, LayoutType layout )
  70. {
  71. if( layout == null )
  72. {
  73. this.layouts[ 0 ].shift = shift;
  74. this.layouts[ 1 ].shift = shift;
  75. this.layouts[ 2 ].shift = shift;
  76. this.layouts[ 3 ].shift = shift;
  77. }
  78. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  79. this.layouts[ 0 ].shift = shift;
  80. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  81. this.layouts[ 1 ].shift = shift;
  82. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  83. this.layouts[ 2 ].shift = shift;
  84. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  85. this.layouts[ 3 ].shift = shift;
  86. }
  87. @Override
  88. public double getShift( LayoutType layout )
  89. {
  90. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  91. return this.layouts[ 0 ].shift;
  92. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  93. return this.layouts[ 1 ].shift;
  94. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  95. return this.layouts[ 2 ].shift;
  96. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  97. return this.layouts[ 3 ].shift;
  98. return 0;
  99. }
  100. @Override
  101. public void setSink( LayeredGraphNode sink, LayoutType layout )
  102. {
  103. if( layout == null )
  104. {
  105. this.layouts[ 0 ].sink = sink;
  106. this.layouts[ 1 ].sink = sink;
  107. this.layouts[ 2 ].sink = sink;
  108. this.layouts[ 3 ].sink = sink;
  109. }
  110. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  111. this.layouts[ 0 ].sink = sink;
  112. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  113. this.layouts[ 1 ].sink = sink;
  114. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  115. this.layouts[ 2 ].sink = sink;
  116. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  117. this.layouts[ 3 ].sink = sink;
  118. }
  119. @Override
  120. public LayeredGraphNode getSink( LayoutType layout )
  121. {
  122. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  123. return this.layouts[ 0 ].sink;
  124. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  125. return this.layouts[ 1 ].sink;
  126. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  127. return this.layouts[ 2 ].sink;
  128. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  129. return this.layouts[ 3 ].sink;
  130. return null;
  131. }
  132. @Override
  133. public boolean isXUndefined( LayoutType layout )
  134. {
  135. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  136. return this.layouts[ 0 ].xUndef;
  137. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  138. return this.layouts[ 1 ].xUndef;
  139. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  140. return this.layouts[ 2 ].xUndef;
  141. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  142. return this.layouts[ 3 ].xUndef;
  143. return true;
  144. }
  145. @Override
  146. public void setAlignTo( LayeredGraphNode align, LayoutType layout )
  147. {
  148. if( layout == null )
  149. {
  150. this.layouts[ 0 ].align = align;
  151. this.layouts[ 1 ].align = align;
  152. this.layouts[ 2 ].align = align;
  153. this.layouts[ 3 ].align = align;
  154. }
  155. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  156. this.layouts[ 0 ].align = align;
  157. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  158. this.layouts[ 1 ].align = align;
  159. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  160. this.layouts[ 2 ].align = align;
  161. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  162. this.layouts[ 3 ].align = align;
  163. }
  164. @Override
  165. public LayeredGraphNode getAlignedTo( LayoutType layout )
  166. {
  167. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  168. return this.layouts[ 0 ].align;
  169. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  170. return this.layouts[ 1 ].align;
  171. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  172. return this.layouts[ 2 ].align;
  173. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  174. return this.layouts[ 3 ].align;
  175. return null;
  176. }
  177. @Override
  178. public void setRoot( LayeredGraphNode root, LayoutType layout )
  179. {
  180. if( layout == null )
  181. {
  182. this.layouts[ 0 ].root = root;
  183. this.layouts[ 1 ].root = root;
  184. this.layouts[ 2 ].root = root;
  185. this.layouts[ 3 ].root = root;
  186. }
  187. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  188. this.layouts[ 0 ].root = root;
  189. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  190. this.layouts[ 1 ].root = root;
  191. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  192. this.layouts[ 2 ].root = root;
  193. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  194. this.layouts[ 3 ].root = root;
  195. }
  196. @Override
  197. public LayeredGraphNode getRoot( LayoutType layout )
  198. {
  199. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  200. return this.layouts[ 0 ].root;
  201. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  202. return this.layouts[ 1 ].root;
  203. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  204. return this.layouts[ 2 ].root;
  205. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  206. return this.layouts[ 3 ].root;
  207. return null;
  208. }
  209. @Override
  210. public void update()
  211. {
  212. SwingUtilities.invokeLater(new Runnable() {
  213. public void run() {
  214. MainView.frame.repaint();
  215. }
  216. });
  217. }
  218. @Override
  219. public void setSelected( LayoutType layout )
  220. {
  221. if( layout == null )
  222. {
  223. this.layouts[ 0 ].selected = true;
  224. this.layouts[ 1 ].selected = true;
  225. this.layouts[ 2 ].selected = true;
  226. this.layouts[ 3 ].selected = true;
  227. }
  228. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  229. this.layouts[ 0 ].selected = true;
  230. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  231. this.layouts[ 1 ].selected = true;
  232. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  233. this.layouts[ 2 ].selected = true;
  234. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  235. this.layouts[ 3 ].selected = true;
  236. update();
  237. }
  238. @Override
  239. public boolean isSelected( LayoutType layout )
  240. {
  241. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  242. {
  243. boolean tmp = layouts[ 0 ].selected;
  244. layouts[ 0 ].selected = false;
  245. return tmp;
  246. }
  247. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  248. {
  249. boolean tmp = layouts[ 1 ].selected;
  250. layouts[ 1 ].selected = false;
  251. return tmp;
  252. }
  253. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  254. {
  255. boolean tmp = layouts[ 2 ].selected;
  256. layouts[ 2 ].selected = false;
  257. return tmp;
  258. }
  259. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  260. {
  261. boolean tmp = layouts[ 3 ].selected;
  262. layouts[ 3 ].selected = false;
  263. return tmp;
  264. }
  265. return false;
  266. }
  267. @Override
  268. public void setColor( Color c, LayoutType layout )
  269. {
  270. if( layout == null )
  271. {
  272. this.layouts[ 0 ].color = c;
  273. this.layouts[ 1 ].color = c;
  274. this.layouts[ 2 ].color = c;
  275. this.layouts[ 3 ].color = c;
  276. }
  277. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  278. this.layouts[ 0 ].color = c;
  279. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  280. this.layouts[ 1 ].color = c;
  281. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  282. this.layouts[ 2 ].color = c;
  283. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  284. this.layouts[ 3 ].color = c;
  285. }
  286. @Override
  287. public Color getColor( LayoutType layout )
  288. {
  289. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  290. return this.layouts[ 0 ].color;
  291. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  292. return this.layouts[ 1 ].color;
  293. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  294. return this.layouts[ 2 ].color;
  295. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  296. return this.layouts[ 3 ].color;
  297. return null;
  298. }
  299. @Override
  300. public void setName( String n ) {
  301. name = n;
  302. }
  303. @Override
  304. public String getName()
  305. {
  306. return name;
  307. }
  308. @Override
  309. public ElkNode getOriginalNode() {
  310. return original;
  311. }
  312. @Override
  313. public void remove() {
  314. parent.removeNode( this );
  315. }
  316. @Override
  317. public LayeredGraphNode parent() {
  318. return parent;
  319. }
  320. @Override
  321. public void setLayer(int index) {
  322. parent.setNodeLayer( this, index );
  323. }
  324. @Override
  325. public int getLayer() {
  326. return parent.getNodeLayer( this );
  327. }
  328. @Override
  329. public void setX(double x, boolean def, LayoutType layout ) {
  330. if( layout == null )
  331. {
  332. layouts[ 0 ].x = x;
  333. layouts[ 1 ].x = x;
  334. layouts[ 2 ].x = x;
  335. layouts[ 3 ].x = x;
  336. }
  337. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  338. {
  339. layouts[ 0 ].xUndef = !def;
  340. layouts[ 0 ].x = x;
  341. }
  342. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  343. {
  344. layouts[ 1 ].xUndef = !def;
  345. layouts[ 1 ].x = x;
  346. }
  347. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  348. {
  349. layouts[ 2 ].xUndef = !def;
  350. layouts[ 2 ].x = x;
  351. }
  352. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  353. {
  354. layouts[ 3 ].xUndef = !def;
  355. layouts[ 3 ].x = x;
  356. }
  357. }
  358. @Override
  359. public void setY(double y, LayoutType layout ) {
  360. if( layout == null )
  361. {
  362. layouts[ 0 ].y = y;
  363. layouts[ 1 ].y = y;
  364. layouts[ 2 ].y = y;
  365. layouts[ 3 ].y = y;
  366. }
  367. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  368. layouts[ 0 ].y = y;
  369. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  370. layouts[ 1 ].y = y;
  371. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  372. layouts[ 2 ].y = y;
  373. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  374. layouts[ 3 ].y = y;
  375. }
  376. @Override
  377. public double getX( LayoutType layout ) {
  378. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  379. return this.layouts[ 0 ].x;
  380. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  381. return this.layouts[ 1 ].x;
  382. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  383. return this.layouts[ 2 ].x;
  384. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  385. return this.layouts[ 3 ].x;
  386. return 0;
  387. }
  388. @Override
  389. public double getY( LayoutType layout ) {
  390. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  391. return this.layouts[ 0 ].y;
  392. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  393. return this.layouts[ 1 ].y;
  394. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  395. return this.layouts[ 2 ].y;
  396. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  397. return this.layouts[ 3 ].y;
  398. return 0;
  399. }
  400. @Override
  401. public double getWidth( LayoutType layout ) {
  402. if( nodes.size() > 0 )
  403. {
  404. double max = 0;
  405. double min = Double.POSITIVE_INFINITY;
  406. for( LayeredGraphNode n : nodes )
  407. {
  408. if( max < n.getX(layout) + n.getWidth(layout) + 50 )
  409. max = n.getX(layout) + n.getWidth(layout) + 50;
  410. min = Math.min( n.getX(layout), min);
  411. }
  412. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  413. return Math.max( max - min, layouts[ 0 ].w );
  414. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  415. return Math.max( max - min, layouts[ 1 ].w );
  416. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  417. return Math.max( max - min, layouts[ 2 ].w );
  418. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  419. return Math.max( max - min, layouts[ 3 ].w );
  420. }
  421. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  422. return layouts[ 0 ].w;
  423. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  424. return layouts[ 1 ].w;
  425. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  426. return layouts[ 2 ].w;
  427. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  428. return layouts[ 3 ].w;
  429. return 0;
  430. }
  431. @Override
  432. public double getHeight( LayoutType layout ) {
  433. if( nodes.size() > 0 )
  434. {
  435. double max = 0;
  436. for( LayeredGraphNode n : nodes )
  437. {
  438. if( max < n.getY(layout) + n.getHeight(layout) + 50 )
  439. max = n.getY(layout) + n.getHeight(layout) + 50;
  440. }
  441. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  442. return Math.max( max, layouts[ 0 ].h );
  443. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  444. return Math.max( max, layouts[ 1 ].h );
  445. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  446. return Math.max( max, layouts[ 2 ].h );
  447. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  448. return Math.max( max, layouts[ 3 ].h );
  449. }
  450. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  451. return layouts[ 0 ].h;
  452. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  453. return layouts[ 1 ].h;
  454. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  455. return layouts[ 2 ].h;
  456. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  457. return layouts[ 3 ].h;
  458. return 0;
  459. }
  460. @Override
  461. public void setWidth( double w, LayoutType layout )
  462. {
  463. if( layout == null )
  464. {
  465. this.layouts[ 0 ].w = w;
  466. this.layouts[ 1 ].w = w;
  467. this.layouts[ 2 ].w = w;
  468. this.layouts[ 3 ].w = w;
  469. }
  470. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  471. this.layouts[ 0 ].w = w;
  472. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  473. this.layouts[ 1 ].w = w;
  474. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  475. this.layouts[ 2 ].w = w;
  476. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  477. this.layouts[ 3 ].w = w;
  478. }
  479. @Override
  480. public void setHeight( double h, LayoutType layout )
  481. {
  482. if( layout == null )
  483. {
  484. this.layouts[ 0 ].h = h;
  485. this.layouts[ 1 ].h = h;
  486. this.layouts[ 2 ].h = h;
  487. this.layouts[ 3 ].h = h;
  488. }
  489. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  490. this.layouts[ 0 ].h = h;
  491. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  492. this.layouts[ 1 ].h = h;
  493. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  494. this.layouts[ 2 ].h = h;
  495. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  496. this.layouts[ 3 ].h = h;
  497. }
  498. @Override
  499. public void removeEdge(LayeredGraphEdge e) {
  500. edges.remove( e );
  501. }
  502. @Override
  503. public void removeNode(LayeredGraphNode n) {
  504. for( LayeredGraphEdge e : n.getIncomingEdges() )
  505. e.remove();
  506. for( LayeredGraphEdge e : n.getOutgoingEdges() )
  507. e.remove();
  508. nodes.remove( n );
  509. for( ArrayList<LayeredGraphNode> l : layers )
  510. {
  511. l.remove( n );
  512. }
  513. }
  514. @Override
  515. public void setNodeLayer(LayeredGraphNode n, int index) {
  516. while( index >= layers.size() )
  517. layers.add( new ArrayList<>() );
  518. int old = n.getLayer();
  519. if( old >= 0 )
  520. layers.get( old ).remove( n );
  521. layers.get( index ).add( n );
  522. }
  523. @Override
  524. public void setOrderedLayer(ArrayList<Double> indizes, int layerIndex) {
  525. ArrayList<LayeredGraphNode> l2 = layers.get( layerIndex );
  526. ArrayList<LayeredGraphNode> result = new ArrayList<LayeredGraphNode>();
  527. while( indizes.size() > 0 )
  528. {
  529. int mIndex = 0;
  530. double min = indizes.get( 0 );
  531. for( int i = 1; i < indizes.size(); i++ )
  532. {
  533. if( min > indizes.get( i ) )
  534. {
  535. mIndex = i;
  536. min = indizes.get( i );
  537. }
  538. }
  539. result.add( l2.get( mIndex ) );
  540. l2.remove( mIndex );
  541. indizes.remove( mIndex );
  542. }
  543. layers.set( layerIndex, result );
  544. }
  545. @Override
  546. public ArrayList<LayeredGraphEdge> getOutgoingEdges() {
  547. return parent.getOutgoingEdges( this );
  548. }
  549. @Override
  550. public ArrayList<LayeredGraphEdge> getSortedOutgoingEdges() {
  551. return parent.getSortedOutgoingEdges( this );
  552. }
  553. @Override
  554. public ArrayList<LayeredGraphEdge> getIncomingEdges() {
  555. return parent.getIncomingEdges( this );
  556. }
  557. @Override
  558. public ArrayList<LayeredGraphEdge> getSortedIncomingEdges() {
  559. return parent.getSortedIncomingEdges( this );
  560. }
  561. @Override
  562. public ArrayList<LayeredGraphEdge> getContainedEdges() {
  563. return edges;
  564. }
  565. @Override
  566. public ArrayList<LayeredGraphNode> getContainedNodes() {
  567. return nodes;
  568. }
  569. @Override
  570. public ArrayList< LayeredGraphNode > getSortedContainedNodes()
  571. {
  572. ArrayList< LayeredGraphNode > result = new ArrayList<>();
  573. for( ArrayList<LayeredGraphNode> l : layers )
  574. {
  575. result.addAll( l );
  576. }
  577. return result;
  578. }
  579. @Override
  580. public ArrayList<ArrayList<LayeredGraphNode>> getContainedLayers() {
  581. return layers;
  582. }
  583. @Override
  584. public int getNodeLayer(LayeredGraphNode n) {
  585. for( int i = 0; i < layers.size(); i++ )
  586. {
  587. if( layers.get( i ).contains( n ) )
  588. return i;
  589. }
  590. return -1;
  591. }
  592. @Override
  593. public ArrayList<LayeredGraphEdge> getOutgoingEdges(LayeredGraphNode n) {
  594. ArrayList<LayeredGraphEdge> result = new ArrayList<>();
  595. for( LayeredGraphEdge e : edges )
  596. {
  597. if( e.getSources().contains( n ) )
  598. result.add( e );
  599. }
  600. return result;
  601. }
  602. @Override
  603. public ArrayList<LayeredGraphEdge> getIncomingEdges(LayeredGraphNode n) {
  604. ArrayList<LayeredGraphEdge> result = new ArrayList<>();
  605. for( LayeredGraphEdge e : edges )
  606. {
  607. if( e.getTargets().contains( n ) )
  608. result.add( e );
  609. }
  610. return result;
  611. }
  612. @Override
  613. public ArrayList<LayeredGraphEdge> getSortedOutgoingEdges(LayeredGraphNode n) {
  614. ArrayList<LayeredGraphEdge> result = new ArrayList<>();
  615. if( n.getLayer() + 1 >= layers.size() )
  616. return result;
  617. ArrayList< LayeredGraphEdge > unsorted = getOutgoingEdges( n );
  618. for( LayeredGraphNode node : layers.get( n.getLayer() + 1 ) )
  619. {
  620. for( LayeredGraphEdge e : unsorted )
  621. {
  622. if( e.getTargets().contains( node ) )
  623. result.add( e );
  624. }
  625. }
  626. return result;
  627. }
  628. @Override
  629. public ArrayList<LayeredGraphEdge> getSortedIncomingEdges(LayeredGraphNode n) {
  630. ArrayList<LayeredGraphEdge> result = new ArrayList<>();
  631. if( n.getLayer() - 1 < 0 )
  632. return result;
  633. ArrayList< LayeredGraphEdge > unsorted = getIncomingEdges( n );
  634. for( LayeredGraphNode node : layers.get( n.getLayer() - 1 ) )
  635. {
  636. for( LayeredGraphEdge e : unsorted )
  637. {
  638. if( e.getSources().contains( node ) )
  639. result.add( e );
  640. }
  641. }
  642. return result;
  643. }
  644. @Override
  645. public LayeredGraphNode createNode(ElkNode original) {
  646. LayeredGraphNode n = new LayeredNode( original, this );
  647. nodes.add( n );
  648. return n;
  649. }
  650. @Override
  651. public LayeredGraphEdge createEdge(ElkEdge original, ArrayList<LayeredGraphNode> sources, ArrayList<LayeredGraphNode> targets) {
  652. LayeredGraphEdge e = new LayeredEdge( original, sources, targets, this );
  653. edges.add( e );
  654. return e;
  655. }
  656. @Override
  657. public LayeredGraphEdge createSimpleEdge(ElkEdge original, LayeredGraphNode source, LayeredGraphNode target) {
  658. ArrayList<LayeredGraphNode> sources = new ArrayList<>();
  659. ArrayList<LayeredGraphNode> targets = new ArrayList<>();
  660. sources.add( source );
  661. targets.add( target );
  662. LayeredGraphEdge e = new LayeredEdge( original, sources, targets, this );
  663. edges.add( e );
  664. return e;
  665. }
  666. @Override
  667. public LayeredGraphEdge findEdgeFromOriginal(Object original) {
  668. for( LayeredGraphEdge e : edges )
  669. {
  670. if( e.getOriginalEdge() == original )
  671. return e;
  672. }
  673. return null;
  674. }
  675. @Override
  676. public LayeredGraphNode findNodeFromOriginal(Object original) {
  677. for( LayeredGraphNode n : nodes )
  678. {
  679. if( n.getOriginalNode() == original )
  680. return n;
  681. }
  682. return null;
  683. }
  684. @Override
  685. public LayeredGraphNode findNodeByName( String name )
  686. {
  687. for( LayeredGraphNode n : nodes )
  688. {
  689. if( n.getName() != null && name != null && n.getName().equals( name ) )
  690. return n;
  691. }
  692. return null;
  693. }
  694. @Override
  695. public void addNode(LayeredGraphNode n) {
  696. nodes.add( n );
  697. n.setParent( this );
  698. }
  699. @Override
  700. public void addEdge(LayeredGraphEdge e) {
  701. edges.add( e );
  702. e.setGraph( this );
  703. }
  704. @Override
  705. public void setParent(LayeredGraphNode parent) {
  706. this.parent = parent;
  707. }
  708. }