MainView.java 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639
  1. package view;
  2. import java.awt.BorderLayout;
  3. import java.awt.Color;
  4. import java.awt.Dimension;
  5. import java.awt.Font;
  6. import java.awt.GridLayout;
  7. import java.awt.event.ActionEvent;
  8. import java.awt.event.ActionListener;
  9. import java.awt.event.ComponentAdapter;
  10. import java.awt.event.ComponentEvent;
  11. import java.awt.event.KeyEvent;
  12. import java.awt.event.MouseAdapter;
  13. import java.awt.event.MouseEvent;
  14. import javax.swing.JButton;
  15. import javax.swing.JFileChooser;
  16. import javax.swing.JFrame;
  17. import javax.swing.JLabel;
  18. import javax.swing.JLayeredPane;
  19. import javax.swing.JPanel;
  20. import javax.swing.JScrollPane;
  21. import javax.swing.JTextArea;
  22. import javax.swing.JTextField;
  23. import javax.swing.JTree;
  24. import javax.swing.event.DocumentEvent;
  25. import javax.swing.event.DocumentListener;
  26. import javax.swing.filechooser.FileNameExtensionFilter;
  27. import javax.swing.tree.DefaultTreeModel;
  28. import javax.swing.tree.TreePath;
  29. import org.eclipse.elk.graph.ElkNode;
  30. import animation.Action;
  31. import animation.AnimationController;
  32. import animation.PseudoCodeNode;
  33. import bk.BKNodePlacement;
  34. import bk.ExtremalLayoutCalc.LayoutType;
  35. import graph.InitializeNodePositions;
  36. import graph.LayeredGraphEdge;
  37. import graph.LayeredGraphNode;
  38. import graph.LayeredNode;
  39. import graph.io.Reader;
  40. import graph.io.Writer;
  41. import lib.TextLayoutHelper;
  42. /**
  43. * The main window of the application.
  44. * There should only be one instance of this class at the same time.
  45. * The JFrame of that single instance can be accessed by the static field {code MainView.frame}.
  46. * @author kolja
  47. *
  48. */
  49. public class MainView {
  50. /**
  51. * The 'frame' of the main window.
  52. * The reason why there can only be one instance of this class.
  53. */
  54. private static int frameCounter = 0;
  55. /**
  56. * Random Graph Generator should olny exist once for all windows (so the values will be stored)
  57. */
  58. private static final RandomGraphDialog randomDialog = new RandomGraphDialog();
  59. private JFrame frame;
  60. private AnimationController controller;
  61. private JButton stepForward;
  62. private JButton stepForwardInto;
  63. private JButton stepForwardOut;
  64. private JButton stepBackward;
  65. private JButton stepBackwardInto;
  66. private JButton stepBackwardOut;
  67. private JButton runForward;
  68. private JButton runBackward;
  69. private JButton pause;
  70. private JButton load;
  71. private JButton save;
  72. private JButton debug;
  73. private JButton options;
  74. private JButton randomGraph;
  75. private JLabel delayText;
  76. private JTextField delay;
  77. private JTree pseudoTree;
  78. private LayeredGraphNode graph;
  79. private OptionsDialog optionsDialog;
  80. private String debugInfo()
  81. {
  82. String info = "Debug Information Table: \n";
  83. info += "_______________________________________________________________________________________________________________________________________________________________________________________________________________________\n";
  84. info += "|" + TextLayoutHelper.strToLen( "Top -> Bottom :> Left", 51 ) + "| |" + TextLayoutHelper.strToLen( "Top -> Bottom :> Right", 51 ) + "| |" + TextLayoutHelper.strToLen( "Bottom -> Top :> Left", 51 ) + "| |" + TextLayoutHelper.strToLen( "Bottom -> Top :> Right", 51 ) + "|\n";
  85. info += "|___________________________________________________| |___________________________________________________| |___________________________________________________| |___________________________________________________|\n";
  86. info += "| Node | Shift | Sink | Root | Align | x | xDef | | Node | Shift | Sink | Root | Align | x | xDef | | Node | Shift | Sink | Root | Align | x | xDef | | Node | Shift | Sink | Root | Align | x | xDef |\n";
  87. for( LayeredGraphNode n : graph.getContainedNodes() )
  88. {
  89. info += "|" + TextLayoutHelper.strToLen( n.getName(), 6 ) +
  90. "|" + TextLayoutHelper.strToLen( n.getShift( LayoutType.TOP_BOTTOM_LEFT ) + "", 7 ) +
  91. "|" + TextLayoutHelper.strToLen( n.getSink( LayoutType.TOP_BOTTOM_LEFT ).getName(), 6 ) +
  92. "|" + TextLayoutHelper.strToLen( n.getRoot( LayoutType.TOP_BOTTOM_LEFT ).getName(), 6 ) +
  93. "|" + TextLayoutHelper.strToLen( n.getAlign( LayoutType.TOP_BOTTOM_LEFT ).getName(), 7 ) +
  94. "|" + TextLayoutHelper.strToLen( n.getX( LayoutType.TOP_BOTTOM_LEFT ) + "", 5 ) +
  95. "|" + TextLayoutHelper.strToLen( !n.isXUndefined( LayoutType.TOP_BOTTOM_LEFT ) + "", 8 ) + "| " +
  96. "|" + TextLayoutHelper.strToLen( n.getName(), 6 ) +
  97. "|" + TextLayoutHelper.strToLen( n.getShift( LayoutType.TOP_BOTTOM_RIGHT ) + "", 7 ) +
  98. "|" + TextLayoutHelper.strToLen( n.getSink( LayoutType.TOP_BOTTOM_RIGHT ).getName(), 6 ) +
  99. "|" + TextLayoutHelper.strToLen( n.getRoot( LayoutType.TOP_BOTTOM_RIGHT ).getName(), 6 ) +
  100. "|" + TextLayoutHelper.strToLen( n.getAlign( LayoutType.TOP_BOTTOM_RIGHT ).getName(), 7 ) +
  101. "|" + TextLayoutHelper.strToLen( n.getX( LayoutType.TOP_BOTTOM_RIGHT ) + "", 5 ) +
  102. "|" + TextLayoutHelper.strToLen( !n.isXUndefined( LayoutType.TOP_BOTTOM_RIGHT ) + "", 8 ) + "| " +
  103. "|" + TextLayoutHelper.strToLen( n.getName(), 6 ) +
  104. "|" + TextLayoutHelper.strToLen( n.getShift( LayoutType.BOTTOM_TOP_LEFT ) + "", 7 ) +
  105. "|" + TextLayoutHelper.strToLen( n.getSink( LayoutType.BOTTOM_TOP_LEFT ).getName(), 6 ) +
  106. "|" + TextLayoutHelper.strToLen( n.getRoot( LayoutType.BOTTOM_TOP_LEFT ).getName(), 6 ) +
  107. "|" + TextLayoutHelper.strToLen( n.getAlign( LayoutType.BOTTOM_TOP_LEFT ).getName(), 7 ) +
  108. "|" + TextLayoutHelper.strToLen( n.getX( LayoutType.BOTTOM_TOP_LEFT ) + "", 5 ) +
  109. "|" + TextLayoutHelper.strToLen( !n.isXUndefined( LayoutType.BOTTOM_TOP_LEFT ) + "", 8 ) + "| " +
  110. "|" + TextLayoutHelper.strToLen( n.getName(), 6 ) +
  111. "|" + TextLayoutHelper.strToLen( n.getShift( LayoutType.BOTTOM_TOP_RIGHT ) + "", 7 ) +
  112. "|" + TextLayoutHelper.strToLen( n.getSink( LayoutType.BOTTOM_TOP_RIGHT ).getName(), 6 ) +
  113. "|" + TextLayoutHelper.strToLen( n.getRoot( LayoutType.BOTTOM_TOP_RIGHT ).getName(), 6 ) +
  114. "|" + TextLayoutHelper.strToLen( n.getAlign( LayoutType.BOTTOM_TOP_RIGHT ).getName(), 7 ) +
  115. "|" + TextLayoutHelper.strToLen( n.getX( LayoutType.BOTTOM_TOP_RIGHT ) + "", 5 ) +
  116. "|" + TextLayoutHelper.strToLen( !n.isXUndefined( LayoutType.BOTTOM_TOP_RIGHT ) + "", 8 ) + "|\n";
  117. }
  118. info += "-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------";
  119. return info;
  120. }
  121. private void showDebugInfo()
  122. {
  123. JFrame debugFrame = new JFrame();
  124. JTextArea info = new JTextArea();
  125. info.setEditable( false );
  126. info.setFont( new Font( Font.MONOSPACED, Font.PLAIN, 11 ) );
  127. String infoS = debugInfo();
  128. info.setText( infoS );
  129. JScrollPane view = new JScrollPane( info );
  130. debugFrame.add( view );
  131. debugFrame.setSize( frame.getWidth(), frame.getHeight() );
  132. debugFrame.setVisible( true );
  133. System.out.println( infoS );
  134. }
  135. public MainView( ElkNode graph )
  136. {
  137. this( LayeredNode.convertToLayeredGraph( graph ) );
  138. }
  139. /**
  140. * Initialize the window and its contents.
  141. * There is good reason not to split up this method to smaller methods:
  142. * Imagine a tree with a fixed number of nodes, but limited degree of branching.
  143. * The the height of the tree is at least inversely proportional to the degree of branching.
  144. * This means halving the maximum method size by splitting methods would make the call stack twice as high
  145. * and this way debugging twice as time-consuming.
  146. * @param graph the graph that is displayed in this window.
  147. */
  148. public MainView( LayeredGraphNode graph )
  149. {
  150. frameCounter++;
  151. this.graph = graph;
  152. controller = new AnimationController();
  153. frame = new JFrame( "NodeShuffler" );
  154. frame.addWindowListener(new java.awt.event.WindowAdapter() {
  155. @Override
  156. public void windowClosing(java.awt.event.WindowEvent windowEvent) {
  157. frameCounter--;
  158. if( frameCounter == 0 )
  159. System.exit( 0 );
  160. }
  161. });
  162. BKNodePlacement algorithm = new BKNodePlacement( controller, graph, frame );
  163. // Create Menu GUI
  164. stepForward = new NiceButton( "stepForward" );
  165. stepForward.setLocation( 10, 10 );
  166. stepForward.setMnemonic( KeyEvent.VK_DOWN );
  167. stepForward.setToolTipText( "Forward step over (alt + down arrow key)" );
  168. stepForward.addActionListener( new ActionListener() {
  169. @Override
  170. public void actionPerformed(ActionEvent e) {
  171. controller.setContinuous( false );
  172. controller.setNextAction( Action.FORWARD_OVER );
  173. }
  174. });
  175. stepForwardInto = new NiceButton( "stepForwardInto" );
  176. stepForwardInto.setLocation( 60, 10 );
  177. stepForwardInto.setMnemonic( KeyEvent.VK_RIGHT );
  178. stepForwardInto.setToolTipText( "Forward step into (alt + right arrow key)" );
  179. stepForwardInto.addActionListener( new ActionListener() {
  180. @Override
  181. public void actionPerformed(ActionEvent e) {
  182. controller.setContinuous( false );
  183. controller.setNextAction( Action.FORWARD );
  184. }
  185. });
  186. stepForwardOut = new NiceButton( "stepForwardOut" );
  187. stepForwardOut.setLocation( 110, 10 );
  188. stepForwardOut.setMnemonic( KeyEvent.VK_PAGE_DOWN );
  189. stepForwardOut.setToolTipText( "Forward step out (alt + page down key)" );
  190. stepForwardOut.addActionListener( new ActionListener() {
  191. @Override
  192. public void actionPerformed(ActionEvent e) {
  193. controller.setContinuous( false );
  194. controller.setNextAction( Action.FORWARD_OUT );
  195. }
  196. });
  197. runForward = new NiceButton( "runForward" );
  198. runForward.setLocation( 160, 10 );
  199. runForward.setMnemonic( KeyEvent.VK_P );
  200. runForward.setToolTipText( "Run forwards (alt + p)" );
  201. runForward.addActionListener( new ActionListener() {
  202. @Override
  203. public void actionPerformed(ActionEvent e) {
  204. controller.setContinuous( true );
  205. controller.setNextAction( Action.FORWARD );
  206. }
  207. });
  208. runBackward = new NiceButton( "runBackward" );
  209. runBackward.setLocation( 160, 60 );
  210. runBackward.setMnemonic( KeyEvent.VK_R );
  211. runBackward.setToolTipText( "Run backwards (alt + r)" );
  212. runBackward.addActionListener( new ActionListener() {
  213. @Override
  214. public void actionPerformed(ActionEvent e) {
  215. controller.setContinuous( true );
  216. controller.setNextAction( Action.BACKWARD );
  217. }
  218. });
  219. options = new NiceButton( "options" );
  220. options.setLocation( 210, 60 );
  221. options.setMnemonic( KeyEvent.VK_O );
  222. options.setToolTipText( "Show Options Dialog (alt + o)" );
  223. options.addActionListener( new ActionListener() {
  224. @Override
  225. public void actionPerformed(ActionEvent e) {
  226. optionsDialog.setVisible( true );
  227. }
  228. });
  229. stepBackward = new NiceButton( "stepBackward" );
  230. stepBackward.setLocation( 10, 60 );
  231. stepBackward.setMnemonic( KeyEvent.VK_UP );
  232. stepBackward.setToolTipText( "Backward step over (alt + up arrow key)" );
  233. stepBackward.addActionListener( new ActionListener() {
  234. @Override
  235. public void actionPerformed(ActionEvent e) {
  236. controller.setContinuous( false );
  237. controller.setNextAction( Action.BACKWARD_OVER );
  238. }
  239. });
  240. stepBackwardInto = new NiceButton( "stepBackwardInto" );
  241. stepBackwardInto.setLocation( 60, 60 );
  242. stepBackwardInto.setMnemonic( KeyEvent.VK_LEFT );
  243. stepBackwardInto.setToolTipText( "Backward step into (alt + left arrow key)" );
  244. stepBackwardInto.addActionListener( new ActionListener() {
  245. @Override
  246. public void actionPerformed(ActionEvent e) {
  247. controller.setContinuous( false );
  248. controller.setNextAction( Action.BACKWARD );
  249. }
  250. });
  251. stepBackwardOut = new NiceButton( "stepBackwardOut" );
  252. stepBackwardOut.setLocation( 110, 60 );
  253. stepBackwardOut.setMnemonic( KeyEvent.VK_PAGE_UP );
  254. stepBackwardOut.setToolTipText( "Backward step out (alt + page up)" );
  255. stepBackwardOut.addActionListener( new ActionListener() {
  256. @Override
  257. public void actionPerformed(ActionEvent e) {
  258. controller.setContinuous( false );
  259. controller.setNextAction( Action.BACKWARD_OUT );
  260. }
  261. });
  262. pause = new NiceButton( "pause" );
  263. pause.setLocation( 210, 10 );
  264. pause.setMnemonic( KeyEvent.VK_PAUSE );
  265. pause.setToolTipText( "Pause (alt + pause)" );
  266. pause.addActionListener( new ActionListener() {
  267. @Override
  268. public void actionPerformed(ActionEvent e) {
  269. controller.setContinuous( false );
  270. }
  271. });
  272. debug = new NiceButton( "debug" );
  273. debug.setLocation( 360, 10 );
  274. debug.setMnemonic( KeyEvent.VK_D );
  275. debug.setToolTipText( "Show debug info (alt + d)" );
  276. debug.addActionListener( new ActionListener() {
  277. @Override
  278. public void actionPerformed(ActionEvent e) {
  279. showDebugInfo();
  280. }
  281. });
  282. randomGraph = new NiceButton( "random" );
  283. randomGraph.setLocation( 360, 60 );
  284. randomGraph.setMnemonic( KeyEvent.VK_G );
  285. randomGraph.setToolTipText( "Generate random graph (alt + g)" );
  286. randomGraph.addActionListener( new ActionListener() {
  287. @Override
  288. public void actionPerformed(ActionEvent e) {
  289. randomDialog.setVisible( true );
  290. }
  291. });
  292. delayText = new JLabel( "Delay (ms)" );
  293. delayText.setBounds( 260, 10, 80, 20 );
  294. delay = new JTextField( String.valueOf(AnimationController.DEFAULT_DELAY) );
  295. delay.setBounds( 260, 30, 90, 20 );
  296. delay.getDocument().addDocumentListener( new DocumentListener() {
  297. @Override
  298. public void insertUpdate(DocumentEvent e) {
  299. try
  300. {
  301. controller.setDelay( Integer.parseInt( delay.getText() ) );
  302. delay.setBackground( Color.WHITE );
  303. } catch( Exception e1 )
  304. {
  305. delay.setBackground( Color.RED );
  306. }
  307. }
  308. @Override
  309. public void removeUpdate(DocumentEvent e) {
  310. try
  311. {
  312. controller.setDelay( Integer.parseInt( delay.getText() ) );
  313. delay.setBackground( Color.WHITE );
  314. } catch( Exception e1 )
  315. {
  316. delay.setBackground( Color.RED );
  317. }
  318. }
  319. @Override
  320. public void changedUpdate(DocumentEvent e) {
  321. try
  322. {
  323. controller.setDelay( Integer.parseInt( delay.getText() ) );
  324. delay.setBackground( Color.WHITE );
  325. } catch( Exception e1 )
  326. {
  327. delay.setBackground( Color.RED );
  328. }
  329. }
  330. });
  331. load = new NiceButton( "load" );
  332. load.setLocation( 260, 60 );
  333. load.setMnemonic( KeyEvent.VK_L );
  334. load.setToolTipText( "Load a graph (alt + l)" );
  335. load.addActionListener( new ActionListener() {
  336. @Override
  337. public void actionPerformed(ActionEvent e) {
  338. JFileChooser chooser = new JFileChooser();
  339. chooser.setFileFilter( new FileNameExtensionFilter("Json Graph", "json") );
  340. chooser.showOpenDialog( frame );
  341. if( chooser.getSelectedFile() != null )
  342. {
  343. Reader r = new Reader( chooser.getSelectedFile().getAbsolutePath() );
  344. LayeredGraphNode graph = r.readInputGraph();
  345. InitializeNodePositions.placeNodes( graph );
  346. new MainView( graph );
  347. }
  348. }
  349. });
  350. save = new NiceButton( "save" );
  351. save.setLocation( 310, 60 );
  352. save.setMnemonic( KeyEvent.VK_S );
  353. save.setToolTipText( "Save graph (alt + s)" );
  354. save.addActionListener( new ActionListener() {
  355. @Override
  356. public void actionPerformed(ActionEvent e) {
  357. JFileChooser chooser = new JFileChooser();
  358. chooser.setFileFilter( new FileNameExtensionFilter("Json Graph", "json") );
  359. chooser.showSaveDialog( frame );
  360. if( chooser.getSelectedFile() != null )
  361. {
  362. Writer w = new Writer( chooser.getSelectedFile().getAbsolutePath() );
  363. w.writeOutputGraph( graph );
  364. }
  365. }
  366. });
  367. pseudoTree = new JTree();
  368. pseudoTree.setBackground(RenderHelper.BACKGROUND_COLOR);
  369. PseudoCodeNode tree = algorithm.createPseudocodeTree( pseudoTree );
  370. tree.setController( controller );
  371. pseudoTree.setModel( new DefaultTreeModel( tree ) );
  372. pseudoTree.setCellRenderer( new PseudoCodeRenderer() );
  373. pseudoTree.setSelectionModel( null );
  374. pseudoTree.addMouseListener( new MouseAdapter() {
  375. public void mousePressed(MouseEvent e) {
  376. TreePath selPath = pseudoTree.getPathForLocation(e.getX(), e.getY());
  377. if( selPath != null && e.getClickCount() == 3 ) {
  378. ((PseudoCodeNode)selPath.getLastPathComponent()).setBreakPoint( !((PseudoCodeNode)selPath.getLastPathComponent()).hasBreakPoint() );
  379. if( !pseudoTree.isExpanded( selPath ) )
  380. {
  381. pseudoTree.collapsePath( selPath );
  382. pseudoTree.expandPath( selPath );
  383. }
  384. else
  385. {
  386. pseudoTree.expandPath( selPath );
  387. pseudoTree.collapsePath( selPath );
  388. }
  389. pseudoTree.repaint();
  390. frame.repaint();
  391. }
  392. }
  393. } );
  394. pseudoTree.setRowHeight(15);
  395. JScrollPane treeView = new JScrollPane( pseudoTree );
  396. treeView.setBounds( 10, 110, 390, 380 );
  397. JTextArea debugText = new JTextArea();
  398. debugText.setFont( new Font( "Monospaced", Font.PLAIN, 12 ) );
  399. debugText.setEditable( false );
  400. debugText.setBackground( RenderHelper.BACKGROUND_COLOR );
  401. debugText.setForeground( RenderHelper.FOREGROUND_COLOR );
  402. JScrollPane debugView = new JScrollPane( debugText );
  403. debugView.setBounds( treeView.getX(), treeView.getY() + 500, treeView.getWidth(), 250 );
  404. frame.setSize( (int)graph.getWidth( LayoutType.TOP_BOTTOM_LEFT ) * 2 + 575, (int)graph.getHeight( LayoutType.TOP_BOTTOM_LEFT ) * 2 + 200 );
  405. frame.setLocation( 100, 100 );
  406. frame.setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );
  407. frame.setVisible( true );
  408. JLayeredPane layne = new JLayeredPane();
  409. JPanel pl = new JPanel();
  410. GridLayout grout = new GridLayout( 2, 2, 10, 10 );
  411. pl.setLayout( grout );
  412. pl.setLocation( 0, 0 );
  413. pl.setSize( frame.getSize() );
  414. NodeView topLeft = createNodeView( graph, LayoutType.TOP_BOTTOM_LEFT );
  415. NodeView topRight = createNodeView( graph, LayoutType.TOP_BOTTOM_RIGHT );
  416. NodeView bottomLeft = createNodeView( graph, LayoutType.BOTTOM_TOP_LEFT );
  417. NodeView bottomRight = createNodeView( graph, LayoutType.BOTTOM_TOP_RIGHT );
  418. pl.add( topLeft );
  419. pl.add( topRight );
  420. pl.add( bottomLeft );
  421. pl.add( bottomRight );
  422. layne.add( pl, 1 );
  423. NodeView combined = createNodeView( graph, LayoutType.COMBINED );
  424. combined.setSize( 500, 500 );
  425. layne.add( combined, 0 );
  426. frame.add( layne );
  427. //JPanel onlyCurrentLayout = new JPanel();
  428. //onlyCurrentLayout.setLayout( new BorderLayout() );
  429. JPanel menue = new JPanel();
  430. menue.setLayout( null );
  431. menue.setPreferredSize( new Dimension( 410, 500 ) );
  432. menue.add( stepForward );
  433. menue.add( stepForwardInto );
  434. menue.add( stepForwardOut );
  435. menue.add( runForward );
  436. menue.add( pause );
  437. menue.add( debug );
  438. menue.add( stepBackward );
  439. menue.add( delayText );
  440. menue.add( delay );
  441. menue.add( treeView );
  442. menue.add( stepBackwardInto );
  443. menue.add( stepBackwardOut );
  444. menue.add( runBackward );
  445. menue.add( randomGraph );
  446. menue.add( save );
  447. menue.add( load );
  448. menue.add( options );
  449. menue.add( debugView );
  450. frame.add( menue, BorderLayout.EAST );
  451. frame.setSize( frame.getWidth() + 1, frame.getHeight() );
  452. frame.setSize( frame.getWidth() - 1, frame.getHeight() );
  453. frame.validate();
  454. frame.repaint();
  455. frame.addComponentListener(new ComponentAdapter()
  456. {
  457. public void componentResized(ComponentEvent evt) {
  458. pl.setSize( layne.getSize() );
  459. menue.setSize( menue.getWidth(), layne.getHeight() );
  460. treeView.setSize( treeView.getWidth(), layne.getHeight() - 370 );
  461. debugView.setBounds( treeView.getX(), treeView.getY() + treeView.getHeight() + 10, treeView.getWidth(), 240 );
  462. if( graph.getColor( LayoutType.COMBINED ) == null )
  463. {
  464. grout.setHgap( 10 );
  465. grout.setVgap( 10 );
  466. }
  467. else
  468. {
  469. grout.setHgap( layne.getWidth() / 3 );
  470. grout.setVgap( layne.getHeight() / 3 );
  471. }
  472. combined.setSize( layne.getWidth() / 3, layne.getHeight() / 3 );
  473. combined.setLocation( layne.getWidth() / 3, layne.getHeight() / 3 );
  474. debugText.setText( algorithm.getDebugString().trim() );
  475. layne.remove( pl );
  476. layne.add( pl, 1 );
  477. if( optionsDialog != null && optionsDialog.getLayerDisplayOption() == 1 )
  478. {
  479. pl.remove( topLeft );
  480. pl.remove( topRight );
  481. pl.remove( bottomLeft );
  482. pl.remove( bottomRight );
  483. pl.remove( combined );
  484. switch( algorithm.getAlgorithmState() )
  485. {
  486. case CONFLICTS:
  487. pl.add( topLeft );
  488. break;
  489. case LAYOUT1:
  490. pl.add( topLeft );
  491. break;
  492. case LAYOUT2:
  493. pl.add( topRight );
  494. break;
  495. case LAYOUT3:
  496. pl.add( bottomLeft );
  497. break;
  498. case LAYOUT4:
  499. pl.add( bottomRight );
  500. break;
  501. case COMBINE:
  502. pl.add( combined );
  503. break;
  504. }
  505. pl.revalidate();
  506. }
  507. frame.repaint();
  508. }
  509. });
  510. optionsDialog = new OptionsDialog();
  511. optionsDialog.addActionListener( new ActionListener() {
  512. @Override
  513. public void actionPerformed(ActionEvent e) {
  514. if( optionsDialog.getLayerDisplayOption() == 0 )
  515. {
  516. pl.remove( topLeft );
  517. pl.remove( topRight );
  518. pl.remove( bottomLeft );
  519. pl.remove( bottomRight );
  520. pl.remove( combined );
  521. pl.setLayout( grout );
  522. pl.add( topLeft );
  523. pl.add( topRight );
  524. pl.add( bottomLeft );
  525. pl.add( bottomRight );
  526. layne.add( combined, 0 );
  527. pl.revalidate();
  528. }
  529. else
  530. {
  531. pl.remove( topLeft );
  532. pl.remove( topRight );
  533. pl.remove( bottomLeft );
  534. pl.remove( bottomRight );
  535. layne.remove( combined );
  536. pl.setLayout( new BorderLayout() );
  537. switch( algorithm.getAlgorithmState() )
  538. {
  539. case CONFLICTS:
  540. pl.add( topLeft );
  541. break;
  542. case LAYOUT1:
  543. pl.add( topLeft );
  544. break;
  545. case LAYOUT2:
  546. pl.add( topRight );
  547. break;
  548. case LAYOUT3:
  549. pl.add( bottomLeft );
  550. break;
  551. case LAYOUT4:
  552. pl.add( bottomRight );
  553. break;
  554. case COMBINE:
  555. pl.add( combined );
  556. break;
  557. }
  558. pl.revalidate();
  559. }
  560. frame.repaint();
  561. }
  562. });
  563. algorithm.start();
  564. }
  565. private NodeView createNodeView( LayeredGraphNode gNode, LayoutType lt )
  566. {
  567. NodeView graphView = new NodeView( gNode, lt );
  568. ((LayeredNode)gNode).setView( graphView, lt );
  569. graphView.setLayout( null );
  570. graphView.setOpaque( true );
  571. for( LayeredGraphNode n : gNode.getContainedNodes() )
  572. {
  573. NodeView nv = createNodeView( n, lt );
  574. nv.setBounds( nv.getX(), nv.getY(), nv.getWidth(), nv.getHeight() );
  575. graphView.add( nv );
  576. }
  577. for( LayeredGraphEdge e : gNode.getContainedEdges() )
  578. {
  579. EdgeView ev = new EdgeView( e, lt );
  580. ev.setOpaque( true );
  581. graphView.add( ev );
  582. }
  583. return graphView;
  584. }
  585. }