LayeredNode.java 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873
  1. package graph;
  2. import java.awt.Color;
  3. import java.util.ArrayList;
  4. import org.eclipse.elk.graph.ElkConnectableShape;
  5. import org.eclipse.elk.graph.ElkEdge;
  6. import org.eclipse.elk.graph.ElkNode;
  7. import org.eclipse.emf.common.util.EList;
  8. import bk.ExtremalLayoutCalc.LayoutType;
  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. private ElkNode original;
  18. private LayeredGraphNode parent;
  19. private boolean dummy;
  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. private class CombinedLayoutInfo
  37. {
  38. public double x;
  39. public double y;
  40. public double w;
  41. public double h;
  42. public Color color;
  43. public boolean selected;
  44. }
  45. private LayoutInfo[] layouts;
  46. private CombinedLayoutInfo combined;
  47. private String name;
  48. // for subgraph in this node
  49. private ArrayList< LayeredGraphEdge > edges;
  50. private ArrayList< LayeredGraphNode > nodes;
  51. private ArrayList< ArrayList< LayeredGraphNode > > layers;
  52. /**
  53. * Konvertiert einen Graph aus dem Elk format in einen Graph, der mehr Informationen enthält
  54. * @param n Der Graph, welcher konvertiert werden soll
  55. * @return Ein layered Graph, welcher im wesentlichen ein Wrapper für den ursprünglichen Graphen ist
  56. */
  57. public static LayeredGraphNode convertToLayeredGraph( ElkNode n )
  58. {
  59. LayeredNode ln = new LayeredNode( n, null );
  60. for( ElkNode node : n.getChildren() )
  61. ln.addNode( convertToLayeredGraph( node ) );
  62. for( ElkEdge edge : n.getContainedEdges() )
  63. {
  64. ArrayList< LayeredGraphNode > sources = new ArrayList<>();
  65. ArrayList< LayeredGraphNode > targets = new ArrayList<>();
  66. EList<ElkConnectableShape> s = edge.getSources();
  67. EList<ElkConnectableShape> t = edge.getTargets();
  68. for( ElkConnectableShape shape : s )
  69. sources.add( ln.findNodeFromOriginal( shape ) );
  70. for( ElkConnectableShape shape : t )
  71. targets.add( ln.findNodeFromOriginal( shape ) );
  72. ln.createEdge( edge, sources, targets );
  73. }
  74. return ln;
  75. }
  76. public LayeredNode( ElkNode original, LayeredGraphNode parent )
  77. {
  78. this.original = original;
  79. this.parent = parent;
  80. edges = new ArrayList<>();
  81. nodes = new ArrayList<>();
  82. layers = new ArrayList<>();
  83. layouts = new LayoutInfo[ 4 ];
  84. for( int i = 0; i < 4; i++ )
  85. layouts[ i ] = new LayoutInfo();
  86. for( LayoutInfo l : layouts )
  87. {
  88. if( original != null )
  89. {
  90. l.x = original.getX();
  91. l.y = original.getX();
  92. l.w = original.getWidth();
  93. l.h = original.getHeight();
  94. }
  95. l.align = this;
  96. l.root = this;
  97. l.sink = this;
  98. l.shift = Double.POSITIVE_INFINITY;
  99. l.xUndef = true;
  100. }
  101. dummy = false;
  102. combined = new CombinedLayoutInfo();
  103. if( original != null )
  104. {
  105. combined.x = original.getX();
  106. combined.y = original.getX();
  107. combined.w = original.getWidth();
  108. combined.h = original.getHeight();
  109. }
  110. combined.color = null;
  111. combined.selected = false;
  112. }
  113. @Override
  114. public void setDummyNode( boolean dummy )
  115. {
  116. this.dummy = dummy;
  117. }
  118. @Override
  119. public boolean isDummyNode()
  120. {
  121. return dummy;
  122. }
  123. @Override
  124. public void setShift( double shift, LayoutType layout )
  125. {
  126. if( layout == null )
  127. {
  128. this.layouts[ 0 ].shift = shift;
  129. this.layouts[ 1 ].shift = shift;
  130. this.layouts[ 2 ].shift = shift;
  131. this.layouts[ 3 ].shift = shift;
  132. }
  133. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  134. this.layouts[ 0 ].shift = shift;
  135. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  136. this.layouts[ 1 ].shift = shift;
  137. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  138. this.layouts[ 2 ].shift = shift;
  139. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  140. this.layouts[ 3 ].shift = shift;
  141. }
  142. @Override
  143. public double getShift( LayoutType layout )
  144. {
  145. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  146. return this.layouts[ 0 ].shift;
  147. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  148. return this.layouts[ 1 ].shift;
  149. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  150. return this.layouts[ 2 ].shift;
  151. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  152. return this.layouts[ 3 ].shift;
  153. return 0;
  154. }
  155. @Override
  156. public void setSink( LayeredGraphNode sink, LayoutType layout )
  157. {
  158. if( layout == null )
  159. {
  160. this.layouts[ 0 ].sink = sink;
  161. this.layouts[ 1 ].sink = sink;
  162. this.layouts[ 2 ].sink = sink;
  163. this.layouts[ 3 ].sink = sink;
  164. }
  165. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  166. this.layouts[ 0 ].sink = sink;
  167. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  168. this.layouts[ 1 ].sink = sink;
  169. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  170. this.layouts[ 2 ].sink = sink;
  171. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  172. this.layouts[ 3 ].sink = sink;
  173. }
  174. @Override
  175. public LayeredGraphNode getSink( LayoutType layout )
  176. {
  177. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  178. return this.layouts[ 0 ].sink;
  179. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  180. return this.layouts[ 1 ].sink;
  181. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  182. return this.layouts[ 2 ].sink;
  183. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  184. return this.layouts[ 3 ].sink;
  185. return null;
  186. }
  187. @Override
  188. public boolean isXUndefined( LayoutType layout )
  189. {
  190. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  191. return this.layouts[ 0 ].xUndef;
  192. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  193. return this.layouts[ 1 ].xUndef;
  194. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  195. return this.layouts[ 2 ].xUndef;
  196. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  197. return this.layouts[ 3 ].xUndef;
  198. return true;
  199. }
  200. @Override
  201. public void setAlign( LayeredGraphNode align, LayoutType layout )
  202. {
  203. if( layout == null )
  204. {
  205. this.layouts[ 0 ].align = align;
  206. this.layouts[ 1 ].align = align;
  207. this.layouts[ 2 ].align = align;
  208. this.layouts[ 3 ].align = align;
  209. }
  210. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  211. this.layouts[ 0 ].align = align;
  212. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  213. this.layouts[ 1 ].align = align;
  214. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  215. this.layouts[ 2 ].align = align;
  216. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  217. this.layouts[ 3 ].align = align;
  218. }
  219. @Override
  220. public LayeredGraphNode getAlign( LayoutType layout )
  221. {
  222. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  223. return this.layouts[ 0 ].align;
  224. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  225. return this.layouts[ 1 ].align;
  226. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  227. return this.layouts[ 2 ].align;
  228. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  229. return this.layouts[ 3 ].align;
  230. return null;
  231. }
  232. @Override
  233. public void setRoot( LayeredGraphNode root, LayoutType layout )
  234. {
  235. if( layout == null )
  236. {
  237. this.layouts[ 0 ].root = root;
  238. this.layouts[ 1 ].root = root;
  239. this.layouts[ 2 ].root = root;
  240. this.layouts[ 3 ].root = root;
  241. }
  242. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  243. this.layouts[ 0 ].root = root;
  244. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  245. this.layouts[ 1 ].root = root;
  246. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  247. this.layouts[ 2 ].root = root;
  248. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  249. this.layouts[ 3 ].root = root;
  250. }
  251. @Override
  252. public LayeredGraphNode getRoot( LayoutType layout )
  253. {
  254. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  255. return this.layouts[ 0 ].root;
  256. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  257. return this.layouts[ 1 ].root;
  258. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  259. return this.layouts[ 2 ].root;
  260. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  261. return this.layouts[ 3 ].root;
  262. return null;
  263. }
  264. @Override
  265. public void setSelected( LayoutType layout )
  266. {
  267. if( layout == null )
  268. {
  269. this.layouts[ 0 ].selected = true;
  270. this.layouts[ 1 ].selected = true;
  271. this.layouts[ 2 ].selected = true;
  272. this.layouts[ 3 ].selected = true;
  273. combined.selected = true;
  274. }
  275. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  276. this.layouts[ 0 ].selected = true;
  277. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  278. this.layouts[ 1 ].selected = true;
  279. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  280. this.layouts[ 2 ].selected = true;
  281. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  282. this.layouts[ 3 ].selected = true;
  283. if( layout == LayoutType.COMBINED )
  284. combined.selected = true;
  285. }
  286. @Override
  287. public void unselectGraph()
  288. {
  289. for( LayeredGraphNode n : nodes)
  290. {
  291. n.unselectGraph();
  292. }
  293. this.layouts[ 0 ].selected = false;
  294. this.layouts[ 1 ].selected = false;
  295. this.layouts[ 2 ].selected = false;
  296. this.layouts[ 3 ].selected = false;
  297. combined.selected = false;
  298. }
  299. @Override
  300. public boolean isSelected( LayoutType layout )
  301. {
  302. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  303. {
  304. boolean tmp = layouts[ 0 ].selected;
  305. layouts[ 0 ].selected = false;
  306. return tmp;
  307. }
  308. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  309. {
  310. boolean tmp = layouts[ 1 ].selected;
  311. layouts[ 1 ].selected = false;
  312. return tmp;
  313. }
  314. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  315. {
  316. boolean tmp = layouts[ 2 ].selected;
  317. layouts[ 2 ].selected = false;
  318. return tmp;
  319. }
  320. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  321. {
  322. boolean tmp = layouts[ 3 ].selected;
  323. layouts[ 3 ].selected = false;
  324. return tmp;
  325. }
  326. if( layout == LayoutType.COMBINED )
  327. {
  328. boolean tmp = combined.selected;
  329. combined.selected = false;
  330. return tmp;
  331. }
  332. return false;
  333. }
  334. @Override
  335. public void setColor( Color c, LayoutType layout )
  336. {
  337. if( layout == null )
  338. {
  339. this.layouts[ 0 ].color = c;
  340. this.layouts[ 1 ].color = c;
  341. this.layouts[ 2 ].color = c;
  342. this.layouts[ 3 ].color = c;
  343. combined.color = c;
  344. }
  345. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  346. this.layouts[ 0 ].color = c;
  347. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  348. this.layouts[ 1 ].color = c;
  349. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  350. this.layouts[ 2 ].color = c;
  351. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  352. this.layouts[ 3 ].color = c;
  353. if( layout == LayoutType.COMBINED )
  354. combined.color = c;
  355. }
  356. @Override
  357. public Color getColor( LayoutType layout )
  358. {
  359. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  360. return this.layouts[ 0 ].color;
  361. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  362. return this.layouts[ 1 ].color;
  363. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  364. return this.layouts[ 2 ].color;
  365. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  366. return this.layouts[ 3 ].color;
  367. if( layout == LayoutType.COMBINED )
  368. return combined.color;
  369. return null;
  370. }
  371. @Override
  372. public void setName( String n ) {
  373. name = n;
  374. }
  375. @Override
  376. public String getName()
  377. {
  378. return name;
  379. }
  380. @Override
  381. public ElkNode getOriginalNode() {
  382. return original;
  383. }
  384. @Override
  385. public void remove() {
  386. parent.removeNode( this );
  387. }
  388. @Override
  389. public LayeredGraphNode parent() {
  390. return parent;
  391. }
  392. @Override
  393. public void setLayer(int index) {
  394. parent.setNodeLayer( this, index );
  395. }
  396. @Override
  397. public int getLayer() {
  398. return parent.getNodeLayer( this );
  399. }
  400. @Override
  401. public void setX(double x, boolean def, LayoutType layout ) {
  402. if( layout == null )
  403. {
  404. layouts[ 0 ].x = x;
  405. layouts[ 1 ].x = x;
  406. layouts[ 2 ].x = x;
  407. layouts[ 3 ].x = x;
  408. combined.x = x;
  409. }
  410. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  411. {
  412. layouts[ 0 ].xUndef = !def;
  413. layouts[ 0 ].x = x;
  414. }
  415. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  416. {
  417. layouts[ 1 ].xUndef = !def;
  418. layouts[ 1 ].x = x;
  419. }
  420. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  421. {
  422. layouts[ 2 ].xUndef = !def;
  423. layouts[ 2 ].x = x;
  424. }
  425. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  426. {
  427. layouts[ 3 ].xUndef = !def;
  428. layouts[ 3 ].x = x;
  429. }
  430. if( layout == LayoutType.COMBINED )
  431. combined.x = x;
  432. }
  433. @Override
  434. public void setY(double y, LayoutType layout ) {
  435. if( layout == null )
  436. {
  437. layouts[ 0 ].y = y;
  438. layouts[ 1 ].y = y;
  439. layouts[ 2 ].y = y;
  440. layouts[ 3 ].y = y;
  441. combined.y = y;
  442. }
  443. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  444. layouts[ 0 ].y = y;
  445. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  446. layouts[ 1 ].y = y;
  447. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  448. layouts[ 2 ].y = y;
  449. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  450. layouts[ 3 ].y = y;
  451. if( layout == LayoutType.COMBINED )
  452. combined.y = y;
  453. }
  454. @Override
  455. public double getX( LayoutType layout ) {
  456. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  457. return this.layouts[ 0 ].x;
  458. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  459. return this.layouts[ 1 ].x;
  460. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  461. return this.layouts[ 2 ].x;
  462. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  463. return this.layouts[ 3 ].x;
  464. if( layout == LayoutType.COMBINED )
  465. return combined.x;
  466. return 0;
  467. }
  468. @Override
  469. public double getY( LayoutType layout ) {
  470. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  471. return this.layouts[ 0 ].y;
  472. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  473. return this.layouts[ 1 ].y;
  474. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  475. return this.layouts[ 2 ].y;
  476. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  477. return this.layouts[ 3 ].y;
  478. if( layout == LayoutType.COMBINED )
  479. return combined.y;
  480. return 0;
  481. }
  482. @Override
  483. public double getWidth( LayoutType layout ) {
  484. if( nodes.size() > 0 )
  485. {
  486. double max = 0;
  487. double min = Double.POSITIVE_INFINITY;
  488. for( LayeredGraphNode n : nodes )
  489. {
  490. if( max < n.getX(layout) + n.getWidth(layout) + 50 )
  491. max = n.getX(layout) + n.getWidth(layout) + 50;
  492. min = Math.min( n.getX(layout), min);
  493. }
  494. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  495. return Math.max( max - min, layouts[ 0 ].w );
  496. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  497. return Math.max( max - min, layouts[ 1 ].w );
  498. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  499. return Math.max( max - min, layouts[ 2 ].w );
  500. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  501. return Math.max( max - min, layouts[ 3 ].w );
  502. if( layout == LayoutType.COMBINED )
  503. return Math.max( max - min, combined.w );
  504. }
  505. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  506. return layouts[ 0 ].w;
  507. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  508. return layouts[ 1 ].w;
  509. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  510. return layouts[ 2 ].w;
  511. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  512. return layouts[ 3 ].w;
  513. if( layout == LayoutType.COMBINED )
  514. return combined.w;
  515. return 0;
  516. }
  517. @Override
  518. public double getHeight( LayoutType layout ) {
  519. if( nodes.size() > 0 )
  520. {
  521. double max = 0;
  522. for( LayeredGraphNode n : nodes )
  523. {
  524. if( max < n.getY(layout) + n.getHeight(layout) + 50 )
  525. max = n.getY(layout) + n.getHeight(layout) + 50;
  526. }
  527. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  528. return Math.max( max, layouts[ 0 ].h );
  529. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  530. return Math.max( max, layouts[ 1 ].h );
  531. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  532. return Math.max( max, layouts[ 2 ].h );
  533. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  534. return Math.max( max, layouts[ 3 ].h );
  535. if( layout == LayoutType.COMBINED )
  536. return Math.max( max, combined.h );
  537. }
  538. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  539. return layouts[ 0 ].h;
  540. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  541. return layouts[ 1 ].h;
  542. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  543. return layouts[ 2 ].h;
  544. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  545. return layouts[ 3 ].h;
  546. if( layout == LayoutType.COMBINED )
  547. return combined.h;
  548. return 0;
  549. }
  550. @Override
  551. public void setWidth( double w, LayoutType layout )
  552. {
  553. if( layout == null )
  554. {
  555. this.layouts[ 0 ].w = w;
  556. this.layouts[ 1 ].w = w;
  557. this.layouts[ 2 ].w = w;
  558. this.layouts[ 3 ].w = w;
  559. combined.w = w;
  560. }
  561. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  562. this.layouts[ 0 ].w = w;
  563. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  564. this.layouts[ 1 ].w = w;
  565. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  566. this.layouts[ 2 ].w = w;
  567. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  568. this.layouts[ 3 ].w = w;
  569. if( layout == LayoutType.COMBINED )
  570. combined.w = w;
  571. }
  572. @Override
  573. public void setHeight( double h, LayoutType layout )
  574. {
  575. if( layout == null )
  576. {
  577. this.layouts[ 0 ].h = h;
  578. this.layouts[ 1 ].h = h;
  579. this.layouts[ 2 ].h = h;
  580. this.layouts[ 3 ].h = h;
  581. combined.h = h;
  582. }
  583. if( layout == LayoutType.TOP_BOTTOM_LEFT )
  584. this.layouts[ 0 ].h = h;
  585. if( layout == LayoutType.TOP_BOTTOM_RIGHT )
  586. this.layouts[ 1 ].h = h;
  587. if( layout == LayoutType.BOTTOM_TOP_LEFT )
  588. this.layouts[ 2 ].h = h;
  589. if( layout == LayoutType.BOTTOM_TOP_RIGHT )
  590. this.layouts[ 3 ].h = h;
  591. if( layout == LayoutType.COMBINED )
  592. combined.h = h;
  593. }
  594. @Override
  595. public void removeEdge(LayeredGraphEdge e) {
  596. edges.remove( e );
  597. }
  598. @Override
  599. public void removeNode(LayeredGraphNode n) {
  600. for( LayeredGraphEdge e : n.getIncomingEdges() )
  601. e.remove();
  602. for( LayeredGraphEdge e : n.getOutgoingEdges() )
  603. e.remove();
  604. nodes.remove( n );
  605. for( ArrayList<LayeredGraphNode> l : layers )
  606. {
  607. l.remove( n );
  608. }
  609. }
  610. @Override
  611. public void setNodeLayer(LayeredGraphNode n, int index) {
  612. while( index >= layers.size() )
  613. layers.add( new ArrayList<>() );
  614. int old = n.getLayer();
  615. if( old >= 0 )
  616. layers.get( old ).remove( n );
  617. layers.get( index ).add( n );
  618. }
  619. @Override
  620. public void setOrderedLayer(ArrayList<Double> indizes, int layerIndex) {
  621. ArrayList<LayeredGraphNode> l2 = layers.get( layerIndex );
  622. ArrayList<LayeredGraphNode> result = new ArrayList<LayeredGraphNode>();
  623. while( indizes.size() > 0 )
  624. {
  625. int mIndex = 0;
  626. double min = indizes.get( 0 );
  627. for( int i = 1; i < indizes.size(); i++ )
  628. {
  629. if( min > indizes.get( i ) )
  630. {
  631. mIndex = i;
  632. min = indizes.get( i );
  633. }
  634. }
  635. result.add( l2.get( mIndex ) );
  636. l2.remove( mIndex );
  637. indizes.remove( mIndex );
  638. }
  639. layers.set( layerIndex, result );
  640. }
  641. @Override
  642. public ArrayList<LayeredGraphEdge> getOutgoingEdges() {
  643. return parent.getOutgoingEdges( this );
  644. }
  645. @Override
  646. public ArrayList<LayeredGraphEdge> getSortedOutgoingEdges() {
  647. return parent.getSortedOutgoingEdges( this );
  648. }
  649. @Override
  650. public ArrayList<LayeredGraphEdge> getIncomingEdges() {
  651. return parent.getIncomingEdges( this );
  652. }
  653. @Override
  654. public ArrayList<LayeredGraphEdge> getSortedIncomingEdges() {
  655. return parent.getSortedIncomingEdges( this );
  656. }
  657. @Override
  658. public ArrayList<LayeredGraphEdge> getContainedEdges() {
  659. return edges;
  660. }
  661. @Override
  662. public ArrayList<LayeredGraphNode> getContainedNodes() {
  663. return nodes;
  664. }
  665. @Override
  666. public ArrayList< LayeredGraphNode > getSortedContainedNodes()
  667. {
  668. ArrayList< LayeredGraphNode > result = new ArrayList<>();
  669. for( ArrayList<LayeredGraphNode> l : layers )
  670. {
  671. result.addAll( l );
  672. }
  673. return result;
  674. }
  675. @Override
  676. public ArrayList<ArrayList<LayeredGraphNode>> getContainedLayers() {
  677. return layers;
  678. }
  679. @Override
  680. public int getNodeLayer(LayeredGraphNode n) {
  681. for( int i = 0; i < layers.size(); i++ )
  682. {
  683. if( layers.get( i ).contains( n ) )
  684. return i;
  685. }
  686. return -1;
  687. }
  688. @Override
  689. public ArrayList<LayeredGraphEdge> getOutgoingEdges(LayeredGraphNode n) {
  690. ArrayList<LayeredGraphEdge> result = new ArrayList<>();
  691. for( LayeredGraphEdge e : edges )
  692. {
  693. if( e.getSources().contains( n ) )
  694. result.add( e );
  695. }
  696. return result;
  697. }
  698. @Override
  699. public ArrayList<LayeredGraphEdge> getIncomingEdges(LayeredGraphNode n) {
  700. ArrayList<LayeredGraphEdge> result = new ArrayList<>();
  701. for( LayeredGraphEdge e : edges )
  702. {
  703. if( e.getTargets().contains( n ) )
  704. result.add( e );
  705. }
  706. return result;
  707. }
  708. @Override
  709. public ArrayList<LayeredGraphEdge> getSortedOutgoingEdges(LayeredGraphNode n) {
  710. ArrayList<LayeredGraphEdge> result = new ArrayList<>();
  711. if( n.getLayer() + 1 >= layers.size() )
  712. return result;
  713. ArrayList< LayeredGraphEdge > unsorted = getOutgoingEdges( n );
  714. for( LayeredGraphNode node : layers.get( n.getLayer() + 1 ) )
  715. {
  716. for( LayeredGraphEdge e : unsorted )
  717. {
  718. if( e.getTargets().contains( node ) )
  719. result.add( e );
  720. }
  721. }
  722. return result;
  723. }
  724. @Override
  725. public ArrayList<LayeredGraphEdge> getSortedIncomingEdges(LayeredGraphNode n) {
  726. ArrayList<LayeredGraphEdge> result = new ArrayList<>();
  727. if( n.getLayer() - 1 < 0 )
  728. return result;
  729. ArrayList< LayeredGraphEdge > unsorted = getIncomingEdges( n );
  730. for( LayeredGraphNode node : layers.get( n.getLayer() - 1 ) )
  731. {
  732. for( LayeredGraphEdge e : unsorted )
  733. {
  734. if( e.getSources().contains( node ) )
  735. result.add( e );
  736. }
  737. }
  738. return result;
  739. }
  740. @Override
  741. public LayeredGraphNode createNode(ElkNode original) {
  742. LayeredGraphNode n = new LayeredNode( original, this );
  743. nodes.add( n );
  744. return n;
  745. }
  746. @Override
  747. public LayeredGraphEdge createEdge(ElkEdge original, ArrayList<LayeredGraphNode> sources, ArrayList<LayeredGraphNode> targets) {
  748. LayeredGraphEdge e = new LayeredEdge( original, sources, targets, this );
  749. edges.add( e );
  750. return e;
  751. }
  752. @Override
  753. public LayeredGraphEdge createSimpleEdge(ElkEdge original, LayeredGraphNode source, LayeredGraphNode target) {
  754. ArrayList<LayeredGraphNode> sources = new ArrayList<>();
  755. ArrayList<LayeredGraphNode> targets = new ArrayList<>();
  756. sources.add( source );
  757. targets.add( target );
  758. LayeredGraphEdge e = new LayeredEdge( original, sources, targets, this );
  759. edges.add( e );
  760. return e;
  761. }
  762. @Override
  763. public LayeredGraphEdge findEdgeFromOriginal(Object original) {
  764. for( LayeredGraphEdge e : edges )
  765. {
  766. if( e.getOriginalEdge() == original )
  767. return e;
  768. }
  769. return null;
  770. }
  771. @Override
  772. public LayeredGraphNode findNodeFromOriginal(Object original) {
  773. for( LayeredGraphNode n : nodes )
  774. {
  775. if( n.getOriginalNode() == original )
  776. return n;
  777. }
  778. return null;
  779. }
  780. @Override
  781. public LayeredGraphNode findNodeByName( String name )
  782. {
  783. for( LayeredGraphNode n : nodes )
  784. {
  785. if( n.getName() != null && name != null && n.getName().equals( name ) )
  786. return n;
  787. }
  788. return null;
  789. }
  790. @Override
  791. public void addNode(LayeredGraphNode n) {
  792. nodes.add( n );
  793. n.setParent( this );
  794. }
  795. @Override
  796. public void addEdge(LayeredGraphEdge e) {
  797. edges.add( e );
  798. e.setGraph( this );
  799. }
  800. @Override
  801. public void setParent(LayeredGraphNode parent) {
  802. this.parent = parent;
  803. }
  804. }