LayeredNode.java 31 KB

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