|
@@ -1,14 +1,26 @@
|
|
|
package view;
|
|
|
|
|
|
+import java.awt.BorderLayout;
|
|
|
+import java.awt.Color;
|
|
|
+import java.awt.Dimension;
|
|
|
import java.awt.GridLayout;
|
|
|
+import java.awt.event.ActionEvent;
|
|
|
+import java.awt.event.ActionListener;
|
|
|
import java.awt.event.ComponentAdapter;
|
|
|
import java.awt.event.ComponentEvent;
|
|
|
import java.awt.event.KeyEvent;
|
|
|
import java.awt.event.KeyListener;
|
|
|
|
|
|
+import javax.swing.JButton;
|
|
|
import javax.swing.JFrame;
|
|
|
+import javax.swing.JLabel;
|
|
|
import javax.swing.JLayeredPane;
|
|
|
import javax.swing.JPanel;
|
|
|
+import javax.swing.JScrollPane;
|
|
|
+import javax.swing.JTextField;
|
|
|
+import javax.swing.JTree;
|
|
|
+import javax.swing.event.DocumentEvent;
|
|
|
+import javax.swing.event.DocumentListener;
|
|
|
|
|
|
import animation.Action;
|
|
|
import animation.AnimationController;
|
|
@@ -31,7 +43,21 @@ public class MainView {
|
|
|
* The reason why there can only be one instance of this class.
|
|
|
*/
|
|
|
public static JFrame frame;
|
|
|
- AnimationController controller;
|
|
|
+ private AnimationController controller;
|
|
|
+ private JButton stepForward;
|
|
|
+ private JButton stepForwardInto;
|
|
|
+ private JButton stepForwardOut;
|
|
|
+ private JButton stepBackward;
|
|
|
+ private JButton stepBackwardInto;
|
|
|
+ private JButton stepBackwardOut;
|
|
|
+ private JButton runForward;
|
|
|
+ private JButton runBackward;
|
|
|
+ private JButton pause;
|
|
|
+ private JButton debug;
|
|
|
+ private JButton generateRandom;
|
|
|
+ private JLabel delayText;
|
|
|
+ private JTextField delay;
|
|
|
+ public static JTree pseudoTree;
|
|
|
|
|
|
private String strToLen( String s, int l )
|
|
|
{
|
|
@@ -50,8 +76,171 @@ public class MainView {
|
|
|
*/
|
|
|
public MainView( LayeredGraphNode graph )
|
|
|
{
|
|
|
- controller = new AnimationController();
|
|
|
- controller.setTimeBetween( 10 );
|
|
|
+ controller = new AnimationController();
|
|
|
+ controller.setTimeBetween( 50 );
|
|
|
+ BKNodePlacement algorithm = new BKNodePlacement( controller, graph );
|
|
|
+
|
|
|
+ // Create Menu GUI
|
|
|
+ stepForward = new NiceButton( "stepForward" );
|
|
|
+ stepForward.setLocation( 10, 10 );
|
|
|
+ stepForward.addActionListener( new ActionListener() {
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void actionPerformed(ActionEvent e) {
|
|
|
+ controller.setContinuous( false );
|
|
|
+ controller.setNextAction( Action.FORWARD_OVER );
|
|
|
+ }
|
|
|
+
|
|
|
+ });
|
|
|
+ stepForwardInto = new NiceButton( "stepForwardInto" );
|
|
|
+ stepForwardInto.setLocation( 60, 10 );
|
|
|
+ stepForwardInto.addActionListener( new ActionListener() {
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void actionPerformed(ActionEvent e) {
|
|
|
+ controller.setContinuous( false );
|
|
|
+ controller.setNextAction( Action.FORWARD );
|
|
|
+ }
|
|
|
+
|
|
|
+ });
|
|
|
+ stepForwardOut = new NiceButton( "stepForwardOut" );
|
|
|
+ stepForwardOut.setLocation( 110, 10 );
|
|
|
+ stepForwardOut.addActionListener( new ActionListener() {
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void actionPerformed(ActionEvent e) {
|
|
|
+ controller.setContinuous( false );
|
|
|
+ controller.setNextAction( Action.FORWARD_OUT );
|
|
|
+ }
|
|
|
+
|
|
|
+ });
|
|
|
+ runForward = new NiceButton( "runForward" );
|
|
|
+ runForward.setLocation( 160, 10 );
|
|
|
+ runForward.addActionListener( new ActionListener() {
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void actionPerformed(ActionEvent e) {
|
|
|
+ controller.setContinuous( true );
|
|
|
+ controller.setNextAction( Action.FORWARD );
|
|
|
+ }
|
|
|
+
|
|
|
+ });
|
|
|
+ runBackward = new NiceButton( "runBackward" );
|
|
|
+ runBackward.setLocation( 160, 60 );
|
|
|
+ runBackward.addActionListener( new ActionListener() {
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void actionPerformed(ActionEvent e) {
|
|
|
+ controller.setContinuous( true );
|
|
|
+ controller.setNextAction( Action.BACKWARD );
|
|
|
+ }
|
|
|
+
|
|
|
+ });
|
|
|
+ stepBackward = new NiceButton( "stepBackward" );
|
|
|
+ stepBackward.setLocation( 10, 60 );
|
|
|
+ stepBackward.addActionListener( new ActionListener() {
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void actionPerformed(ActionEvent e) {
|
|
|
+ controller.setContinuous( false );
|
|
|
+ controller.setNextAction( Action.BACKWARD_OVER );
|
|
|
+ }
|
|
|
+
|
|
|
+ });
|
|
|
+ stepBackwardInto = new NiceButton( "stepBackwardInto" );
|
|
|
+ stepBackwardInto.setLocation( 60, 60 );
|
|
|
+ stepBackwardInto.addActionListener( new ActionListener() {
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void actionPerformed(ActionEvent e) {
|
|
|
+ controller.setContinuous( false );
|
|
|
+ controller.setNextAction( Action.BACKWARD );
|
|
|
+ }
|
|
|
+
|
|
|
+ });
|
|
|
+ stepBackwardOut = new NiceButton( "stepBackwardOut" );
|
|
|
+ stepBackwardOut.setLocation( 110, 60 );
|
|
|
+ stepBackwardOut.addActionListener( new ActionListener() {
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void actionPerformed(ActionEvent e) {
|
|
|
+ controller.setContinuous( false );
|
|
|
+ controller.setNextAction( Action.BACKWARD_OUT );
|
|
|
+ }
|
|
|
+
|
|
|
+ });
|
|
|
+ pause = new NiceButton( "pause" );
|
|
|
+ pause.setLocation( 210, 10 );
|
|
|
+ pause.addActionListener( new ActionListener() {
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void actionPerformed(ActionEvent e) {
|
|
|
+ controller.setContinuous( false );
|
|
|
+ }
|
|
|
+
|
|
|
+ });
|
|
|
+ debug = new NiceButton( "debug" );
|
|
|
+ debug.setLocation( 350, 10 );
|
|
|
+ generateRandom = new NiceButton( "generateRandom" );
|
|
|
+ generateRandom.setLocation( 350, 60 );
|
|
|
+ generateRandom.addActionListener( new ActionListener() {
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void actionPerformed(ActionEvent e) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ });
|
|
|
+ delayText = new JLabel( "Delay (ms)" );
|
|
|
+ delayText.setBounds( 260, 10, 80, 20 );
|
|
|
+ delay = new JTextField( "50" );
|
|
|
+ delay.setBounds( 260, 30, 80, 20 );
|
|
|
+ delay.getDocument().addDocumentListener( new DocumentListener() {
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void insertUpdate(DocumentEvent e) {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ controller.setTimeBetween( Integer.parseInt( delay.getText() ) );
|
|
|
+ delay.setBackground( Color.WHITE );
|
|
|
+ } catch( Exception e1 )
|
|
|
+ {
|
|
|
+ delay.setBackground( Color.RED );
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void removeUpdate(DocumentEvent e) {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ controller.setTimeBetween( Integer.parseInt( delay.getText() ) );
|
|
|
+ delay.setBackground( Color.WHITE );
|
|
|
+ } catch( Exception e1 )
|
|
|
+ {
|
|
|
+ delay.setBackground( Color.RED );
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void changedUpdate(DocumentEvent e) {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ controller.setTimeBetween( Integer.parseInt( delay.getText() ) );
|
|
|
+ delay.setBackground( Color.WHITE );
|
|
|
+ } catch( Exception e1 )
|
|
|
+ {
|
|
|
+ delay.setBackground( Color.RED );
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ });
|
|
|
+ pseudoTree = new JTree( algorithm.createPseudocodeTree() );
|
|
|
+ pseudoTree.setEnabled( false );
|
|
|
+ pseudoTree.setCellRenderer( new PseudoCodeRenderer() );
|
|
|
+
|
|
|
+ JScrollPane treeView = new JScrollPane( pseudoTree );
|
|
|
+ treeView.setBounds( 10, 110, 380, 380 );
|
|
|
+
|
|
|
frame = new JFrame(); // this may write to a static field because there should be only one instance of this class.
|
|
|
frame.setSize( Math.min( (int)graph.getWidth( LayoutType.TOP_BOTTOM_LEFT ) * 2 + 200, 1700 ), Math.min( (int)graph.getHeight( LayoutType.TOP_BOTTOM_LEFT ) * 2 + 200, 900 ) );
|
|
|
frame.setLocation( 100, 100 );
|
|
@@ -149,6 +338,23 @@ public class MainView {
|
|
|
combined.setSize( 500, 500 );
|
|
|
layne.add( combined, 0 );
|
|
|
frame.add( layne );
|
|
|
+ JPanel menue = new JPanel();
|
|
|
+ menue.setLayout( null );
|
|
|
+ menue.setPreferredSize( new Dimension( 400, 500 ) );
|
|
|
+ menue.add( stepForward );
|
|
|
+ menue.add( stepForwardInto );
|
|
|
+ menue.add( stepForwardOut );
|
|
|
+ menue.add( runForward );
|
|
|
+ menue.add( pause );
|
|
|
+ menue.add( debug );
|
|
|
+ menue.add( stepBackward );
|
|
|
+ menue.add( delayText );
|
|
|
+ menue.add( delay );
|
|
|
+ menue.add( treeView );
|
|
|
+ //menue.add( stepBackwardInto );
|
|
|
+ menue.add( stepBackwardOut );
|
|
|
+ menue.add( runBackward );
|
|
|
+ frame.add( menue, BorderLayout.EAST );
|
|
|
frame.validate();
|
|
|
frame.repaint();
|
|
|
|
|
@@ -156,6 +362,8 @@ public class MainView {
|
|
|
{
|
|
|
public void componentResized(ComponentEvent evt) {
|
|
|
pl.setSize( layne.getSize() );
|
|
|
+ menue.setSize( menue.getWidth(), layne.getHeight() );
|
|
|
+ treeView.setSize( treeView.getWidth(), layne.getHeight() - 120 );
|
|
|
if( graph.getColor( LayoutType.COMBINED ) == null )
|
|
|
{
|
|
|
grout.setHgap( 10 );
|
|
@@ -172,7 +380,7 @@ public class MainView {
|
|
|
frame.repaint();
|
|
|
}
|
|
|
});
|
|
|
- new BKNodePlacement( controller, graph ).start();
|
|
|
+ algorithm.start();
|
|
|
}
|
|
|
|
|
|
private NodeView createNodeView( LayeredGraphNode gNode, LayoutType lt )
|