BKNodePlacement.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. package bk;
  2. import java.lang.reflect.InvocationTargetException;
  3. import javax.swing.JFrame;
  4. import javax.swing.JTree;
  5. import animation.AlgorithmStage;
  6. import animation.AnimatedAlgorithm;
  7. import animation.AnimationController;
  8. import animation.PseudoCodeNode;
  9. import graph.LayeredGraphNode;
  10. /**
  11. * The main stage of the BK node placement algorithm.
  12. * @author kolja
  13. *
  14. */
  15. public class BKNodePlacement extends AnimatedAlgorithm {
  16. /*
  17. * Private data structures to store the process of the algorithm
  18. */
  19. private enum State
  20. {
  21. CONFLICTS,
  22. LAYOUT1,
  23. LAYOUT2,
  24. LAYOUT3,
  25. LAYOUT4,
  26. COMBINE
  27. }
  28. private ConflictDetection conftion;
  29. private State state;
  30. private ExtremalLayoutCalc layouts[];
  31. private Combine combine;
  32. private PseudoCodeNode conflictsNode;
  33. private PseudoCodeNode layout1Node;
  34. private PseudoCodeNode layout2Node;
  35. private PseudoCodeNode layout3Node;
  36. private PseudoCodeNode layout4Node;
  37. private PseudoCodeNode combineNode;
  38. private boolean inside;
  39. public BKNodePlacement(AnimationController controller, LayeredGraphNode graph, JFrame view) {
  40. super(controller, graph, view);
  41. state = State.CONFLICTS;
  42. conftion = new ConflictDetection( graph );
  43. layouts = new ExtremalLayoutCalc[ 4 ];
  44. layouts[ 0 ] = new ExtremalLayoutCalc( ExtremalLayoutCalc.LayoutType.TOP_BOTTOM_LEFT, graph );
  45. layouts[ 1 ] = new ExtremalLayoutCalc( ExtremalLayoutCalc.LayoutType.TOP_BOTTOM_RIGHT, graph );
  46. layouts[ 2 ] = new ExtremalLayoutCalc( ExtremalLayoutCalc.LayoutType.BOTTOM_TOP_LEFT, graph );
  47. layouts[ 3 ] = new ExtremalLayoutCalc( ExtremalLayoutCalc.LayoutType.BOTTOM_TOP_RIGHT, graph );
  48. combine = new Combine( graph );
  49. inside = false;
  50. }
  51. @Override
  52. public StageStatus forwardStep() {
  53. return forward( "forwardStep" );
  54. }
  55. @Override
  56. public StageStatus backwardStep() {
  57. return backward( "backwardStep" );
  58. }
  59. @Override
  60. public PseudoCodeNode createPseudocodeTree( JTree tree )
  61. {
  62. PseudoCodeNode root = new PseudoCodeNode( "BK Node Placement Algorithm", tree );
  63. root.setSelected( true );
  64. conflictsNode = conftion.createPseudocodeTree( tree );
  65. layout1Node = layouts[ 0 ].createPseudocodeTree( tree );
  66. layout2Node = layouts[ 1 ].createPseudocodeTree( tree );
  67. layout3Node = layouts[ 2 ].createPseudocodeTree( tree );
  68. layout4Node = layouts[ 3 ].createPseudocodeTree( tree );
  69. combineNode = combine.createPseudocodeTree( tree );
  70. root.add( conflictsNode );
  71. root.add( layout1Node );
  72. root.add( layout2Node );
  73. root.add( layout3Node );
  74. root.add( layout4Node );
  75. root.add( combineNode );
  76. return root;
  77. }
  78. @Override
  79. public StageStatus forwardStepOver() {
  80. if( !inside )
  81. {
  82. State oldState = state;
  83. StageStatus status = StageStatus.UNFINISHED;
  84. while( state == oldState && status != StageStatus.FINISHED )
  85. status = forwardStep();
  86. return status;
  87. }
  88. else
  89. return forward( "forwardStepOver" );
  90. }
  91. @Override
  92. public StageStatus forwardStepOut() {
  93. if( !inside )
  94. {
  95. StageStatus status = StageStatus.UNFINISHED;
  96. while( status != StageStatus.FINISHED )
  97. status = forwardStep();
  98. return status;
  99. }
  100. else
  101. return forward( "forwardStepOut" );
  102. }
  103. @Override
  104. public StageStatus backwardStepOver() {
  105. if( !inside )
  106. {
  107. State oldState = state;
  108. StageStatus status = StageStatus.UNFINISHED;
  109. while( state == oldState && status != StageStatus.FINISHED )
  110. status = backwardStep();
  111. return status;
  112. }
  113. else
  114. return backward( "backwardStepOver" );
  115. }
  116. @Override
  117. public StageStatus backwardStepOut() {
  118. if( !inside )
  119. {
  120. StageStatus status = StageStatus.UNFINISHED;
  121. while( status != StageStatus.FINISHED )
  122. status = backwardStep();
  123. return status;
  124. }
  125. else
  126. return backward( "backwardStepOut" );
  127. }
  128. private StageStatus forward( String fName )
  129. {
  130. try {
  131. switch( state )
  132. {
  133. case CONFLICTS:
  134. conflictsNode.setSelected( true );
  135. if( (StageStatus)(ConflictDetection.class.getMethod( fName ).invoke( conftion ) ) == StageStatus.FINISHED )
  136. {
  137. inside = false;
  138. conflictsNode.setSelected( false );
  139. layout1Node.setSelected( true );
  140. state = State.LAYOUT1;
  141. }
  142. else
  143. inside = true;
  144. break;
  145. case LAYOUT1:
  146. if( (StageStatus)(ExtremalLayoutCalc.class.getMethod( fName ).invoke( layouts[ 0 ] ) ) == StageStatus.FINISHED )
  147. {
  148. inside = false;
  149. layout1Node.setSelected( false );
  150. layout2Node.setSelected( true );
  151. state = State.LAYOUT2;
  152. }
  153. else
  154. inside = true;
  155. break;
  156. case LAYOUT2:
  157. if( (StageStatus)(ExtremalLayoutCalc.class.getMethod( fName ).invoke( layouts[ 1 ] ) ) == StageStatus.FINISHED )
  158. {
  159. inside = false;
  160. layout2Node.setSelected( false );
  161. layout3Node.setSelected( true );
  162. state = State.LAYOUT3;
  163. }
  164. else
  165. inside = true;
  166. break;
  167. case LAYOUT3:
  168. if( (StageStatus)(ExtremalLayoutCalc.class.getMethod( fName ).invoke( layouts[ 2 ] ) ) == StageStatus.FINISHED )
  169. {
  170. inside = false;
  171. layout3Node.setSelected( false );
  172. layout4Node.setSelected( true );
  173. state = State.LAYOUT4;
  174. }
  175. else
  176. inside = true;
  177. break;
  178. case LAYOUT4:
  179. if( (StageStatus)(ExtremalLayoutCalc.class.getMethod( fName ).invoke( layouts[ 3 ] ) ) == StageStatus.FINISHED )
  180. {
  181. inside = false;
  182. layout4Node.setSelected( false );
  183. combineNode.setSelected( true );
  184. state = State.COMBINE;
  185. }
  186. else
  187. inside = true;
  188. break;
  189. case COMBINE:
  190. if( (StageStatus)(Combine.class.getMethod( fName ).invoke( combine ) ) == StageStatus.FINISHED )
  191. {
  192. inside = false;
  193. return StageStatus.FINISHED;
  194. }
  195. else
  196. inside = true;
  197. }
  198. } catch (IllegalAccessException e) {
  199. e.printStackTrace();
  200. } catch (IllegalArgumentException e) {
  201. e.printStackTrace();
  202. } catch (InvocationTargetException e) {
  203. e.printStackTrace();
  204. } catch (NoSuchMethodException e) {
  205. e.printStackTrace();
  206. } catch (SecurityException e) {
  207. e.printStackTrace();
  208. }
  209. return StageStatus.UNFINISHED;
  210. }
  211. private StageStatus backward( String fName ) {
  212. try {
  213. switch( state )
  214. {
  215. case CONFLICTS:
  216. if( (StageStatus)(ConflictDetection.class.getMethod( fName ).invoke( conftion ) ) == StageStatus.FINISHED )
  217. {
  218. inside = false;
  219. return StageStatus.FINISHED;
  220. }
  221. else
  222. inside = true;
  223. case LAYOUT1:
  224. if( (StageStatus)(ExtremalLayoutCalc.class.getMethod( fName ).invoke( layouts[ 0 ] ) ) == StageStatus.FINISHED )
  225. {
  226. inside = false;
  227. layout1Node.setSelected( false );
  228. conflictsNode.setSelected( true );
  229. state = State.CONFLICTS;
  230. }
  231. else
  232. inside = true;
  233. break;
  234. case LAYOUT2:
  235. if( (StageStatus)(ExtremalLayoutCalc.class.getMethod( fName ).invoke( layouts[ 1 ] ) ) == AlgorithmStage.StageStatus.FINISHED )
  236. {
  237. inside = false;
  238. layout2Node.setSelected( false );
  239. layout1Node.setSelected( true );
  240. state = State.LAYOUT1;
  241. }
  242. else
  243. inside = true;
  244. break;
  245. case LAYOUT3:
  246. if( (StageStatus)(ExtremalLayoutCalc.class.getMethod( fName ).invoke( layouts[ 2 ] ) ) == AlgorithmStage.StageStatus.FINISHED )
  247. {
  248. inside = false;
  249. layout3Node.setSelected( false );
  250. layout2Node.setSelected( true );
  251. state = State.LAYOUT2;
  252. }
  253. else
  254. inside = true;
  255. break;
  256. case LAYOUT4:
  257. if( (StageStatus)(ExtremalLayoutCalc.class.getMethod( fName ).invoke( layouts[ 3 ] ) ) == AlgorithmStage.StageStatus.FINISHED )
  258. {
  259. inside = false;
  260. layout4Node.setSelected( false );
  261. layout3Node.setSelected( true );
  262. state = State.LAYOUT3;
  263. }
  264. else
  265. inside = true;
  266. break;
  267. case COMBINE:
  268. if( (StageStatus)(Combine.class.getMethod( fName ).invoke( combine ) ) == AlgorithmStage.StageStatus.FINISHED )
  269. {
  270. inside = false;
  271. combineNode.setSelected( false );
  272. layout4Node.setSelected( true );
  273. state = State.LAYOUT4;
  274. }
  275. else
  276. inside = true;
  277. break;
  278. }
  279. } catch (IllegalAccessException e) {
  280. e.printStackTrace();
  281. } catch (IllegalArgumentException e) {
  282. e.printStackTrace();
  283. } catch (InvocationTargetException e) {
  284. e.printStackTrace();
  285. } catch (NoSuchMethodException e) {
  286. e.printStackTrace();
  287. } catch (SecurityException e) {
  288. e.printStackTrace();
  289. }
  290. return StageStatus.UNFINISHED;
  291. }
  292. }