Browse Source

Merge remote-tracking branch 'origin/master'

Eren Yilmaz 6 years ago
parent
commit
01c284c4e6

+ 3 - 1
src/animation/AlgorithmStage.java

@@ -1,5 +1,7 @@
 package animation;
 
+import javax.swing.JTree;
+
 import bk.BlockCalc;
 
 /**
@@ -43,5 +45,5 @@ public interface AlgorithmStage {
     
     public StageStatus backwardStepOut();
 	
-    public PseudoCodeNode createPseudocodeTree();
+    public PseudoCodeNode createPseudocodeTree( JTree tree );
 }

+ 2 - 1
src/animation/AnimatedAlgorithm.java

@@ -4,6 +4,7 @@ import java.awt.event.ComponentEvent;
 import java.awt.event.ComponentListener;
 
 import javax.swing.JFrame;
+import javax.swing.JTree;
 import javax.swing.SwingUtilities;
 
 import graph.LayeredGraphNode;
@@ -81,5 +82,5 @@ public abstract class AnimatedAlgorithm extends Thread implements AlgorithmStage
 		}
 	}
 	
-    public abstract PseudoCodeNode createPseudocodeTree();
+    public abstract PseudoCodeNode createPseudocodeTree( JTree tree );
 }

+ 8 - 10
src/animation/PseudoCodeNode.java

@@ -1,10 +1,9 @@
 package animation;
 
+import javax.swing.JTree;
 import javax.swing.tree.DefaultMutableTreeNode;
 import javax.swing.tree.TreePath;
 
-import view.MainView;
-
 public class PseudoCodeNode extends DefaultMutableTreeNode {
 
     /**
@@ -13,11 +12,13 @@ public class PseudoCodeNode extends DefaultMutableTreeNode {
     private static final long serialVersionUID = 1L;
     
     private boolean selected;
+    private JTree tree;
     
-    public PseudoCodeNode( String description )
+    public PseudoCodeNode( String description, JTree tree )
     {
         super( description );
         selected = false;
+        this.tree = tree;
     }
     
     public boolean isSelected()
@@ -27,13 +28,10 @@ public class PseudoCodeNode extends DefaultMutableTreeNode {
     
     public void setSelected( boolean selected )
     {
-        if( MainView.pseudoTree != null )
-        {
-            if( selected )
-                MainView.pseudoTree.expandPath( new TreePath( this.getPath() ) );
-            else
-                MainView.pseudoTree.collapsePath( new TreePath( this.getPath() ) );
-        }
+        if( selected )
+            tree.expandPath( new TreePath( this.getPath() ) );
+        else
+            tree.collapsePath( new TreePath( this.getPath() ) );
         this.selected = selected;
     }
 }

+ 9 - 8
src/bk/BKNodePlacement.java

@@ -3,6 +3,7 @@ package bk;
 import java.lang.reflect.InvocationTargetException;
 
 import javax.swing.JFrame;
+import javax.swing.JTree;
 
 import animation.AlgorithmStage;
 import animation.AnimatedAlgorithm;
@@ -67,16 +68,16 @@ public class BKNodePlacement extends AnimatedAlgorithm {
 	}
 	
 	@Override
-	public PseudoCodeNode createPseudocodeTree()
+	public PseudoCodeNode createPseudocodeTree( JTree tree )
 	{
-	    PseudoCodeNode root = new PseudoCodeNode( "BK Node Placement Algorithm" );
+	    PseudoCodeNode root = new PseudoCodeNode( "BK Node Placement Algorithm", tree );
 	    root.setSelected( true );
-        conflictsNode = conftion.createPseudocodeTree();
-        layout1Node = layouts[ 0 ].createPseudocodeTree();
-        layout2Node = layouts[ 1 ].createPseudocodeTree();
-        layout3Node = layouts[ 2 ].createPseudocodeTree();
-        layout4Node = layouts[ 3 ].createPseudocodeTree();
-        combineNode = combine.createPseudocodeTree();
+        conflictsNode = conftion.createPseudocodeTree( tree );
+        layout1Node = layouts[ 0 ].createPseudocodeTree( tree );
+        layout2Node = layouts[ 1 ].createPseudocodeTree( tree );
+        layout3Node = layouts[ 2 ].createPseudocodeTree( tree );
+        layout4Node = layouts[ 3 ].createPseudocodeTree( tree );
+        combineNode = combine.createPseudocodeTree( tree );
         root.add( conflictsNode );
         root.add( layout1Node );
         root.add( layout2Node );

+ 5 - 3
src/bk/BlockCalc.java

@@ -4,6 +4,8 @@ import java.awt.Color;
 import java.util.ArrayList;
 import java.util.Collections;
 
+import javax.swing.JTree;
+
 import animation.AlgorithmStage;
 import animation.BackwardAction;
 import animation.PseudoCodeNode;
@@ -240,9 +242,9 @@ public class BlockCalc implements AlgorithmStage {
 	}
 
     @Override
-    public PseudoCodeNode createPseudocodeTree() {
-        PseudoCodeNode root = new PseudoCodeNode( "Vertical alignment" );
-        loopNode = new PseudoCodeNode( "Loop through all nodes..." );
+    public PseudoCodeNode createPseudocodeTree( JTree tree ) {
+        PseudoCodeNode root = new PseudoCodeNode( "Vertical alignment", tree );
+        loopNode = new PseudoCodeNode( "Loop through all nodes...", tree );
         root.add( loopNode );
         return root;
     }

+ 7 - 6
src/bk/Combine.java

@@ -4,12 +4,13 @@ import java.awt.Color;
 import java.util.ArrayList;
 import java.util.Collections;
 
+import javax.swing.JTree;
+
 import animation.AlgorithmStage;
 import animation.BackwardAction;
 import animation.PseudoCodeNode;
 import bk.ExtremalLayoutCalc.LayoutType;
 import graph.LayeredGraphNode;
-import view.MainView;
 
 /**
  * The stage of the combination of the four extremal layouts.
@@ -153,11 +154,11 @@ public class Combine implements AlgorithmStage {
 	}
 
     @Override
-    public PseudoCodeNode createPseudocodeTree() {
-        PseudoCodeNode root = new PseudoCodeNode( "Balancing" );
-        alignNode = new PseudoCodeNode( "Align Layouts" );
-        setNode = new PseudoCodeNode( "Align to assignment of smallest width" );
-        loopNode = new PseudoCodeNode( "Set coordinates to average median of aligned candidates" );
+    public PseudoCodeNode createPseudocodeTree( JTree tree ) {
+        PseudoCodeNode root = new PseudoCodeNode( "Balancing", tree );
+        alignNode = new PseudoCodeNode( "Align Layouts", tree );
+        setNode = new PseudoCodeNode( "Align to assignment of smallest width", tree );
+        loopNode = new PseudoCodeNode( "Set coordinates to average median of aligned candidates", tree );
         setNode.add( loopNode );
         root.add( alignNode );
         root.add( setNode );

+ 8 - 6
src/bk/Compaction.java

@@ -2,6 +2,8 @@ package bk;
 
 import java.util.ArrayList;
 
+import javax.swing.JTree;
+
 import animation.AlgorithmStage;
 import animation.BackwardAction;
 import animation.PseudoCodeNode;
@@ -332,13 +334,13 @@ public class Compaction implements AlgorithmStage{
 	}
 
     @Override
-    public PseudoCodeNode createPseudocodeTree() {
-        PseudoCodeNode root = new PseudoCodeNode( "Horizontal compaction" );
-        placeNode = new PseudoCodeNode( "Root coordinates relative to sink" );
-        placeLoopNode = new PseudoCodeNode( "Loop through root nodes..." );
+    public PseudoCodeNode createPseudocodeTree( JTree tree ) {
+        PseudoCodeNode root = new PseudoCodeNode( "Horizontal compaction", tree );
+        placeNode = new PseudoCodeNode( "Root coordinates relative to sink", tree );
+        placeLoopNode = new PseudoCodeNode( "Loop through root nodes...", tree );
         placeNode.add( placeLoopNode );
-        applyNode = new PseudoCodeNode( "Absolute coordinates" );
-        applyLoopNode = new PseudoCodeNode( "Loop through all nodes..." );
+        applyNode = new PseudoCodeNode( "Absolute coordinates", tree );
+        applyLoopNode = new PseudoCodeNode( "Loop through all nodes...", tree );
         applyNode.add( applyLoopNode );
         root.add( placeNode );
         root.add( applyNode );

+ 6 - 4
src/bk/ConflictDetection.java

@@ -2,6 +2,8 @@ package bk;
 
 import java.util.ArrayList;
 
+import javax.swing.JTree;
+
 import animation.AlgorithmStage;
 import animation.BackwardAction;
 import animation.PseudoCodeNode;
@@ -117,10 +119,10 @@ public class ConflictDetection implements AlgorithmStage {
     }
 
     @Override
-    public PseudoCodeNode createPseudocodeTree() {
-        PseudoCodeNode root = new PseudoCodeNode( "Preprocessing (mark type 1 conflicts)" );
-        PseudoCodeNode loopNode = new PseudoCodeNode( "Loop through all nodes..." );
-        markNode = new PseudoCodeNode( "If non-inner segment crosses an inner segment whose target is this node, mark the non-inner segment as conflicted" );
+    public PseudoCodeNode createPseudocodeTree( JTree tree ) {
+        PseudoCodeNode root = new PseudoCodeNode( "Preprocessing (mark type 1 conflicts)", tree );
+        PseudoCodeNode loopNode = new PseudoCodeNode( "Loop through all nodes...", tree );
+        markNode = new PseudoCodeNode( "If non-inner segment crosses an inner segment whose target is this node, mark the non-inner segment as conflicted", tree );
         loopNode.add( markNode );
         root.add( loopNode );
         return root;

+ 9 - 7
src/bk/ExtremalLayoutCalc.java

@@ -2,6 +2,8 @@ package bk;
 
 import java.lang.reflect.InvocationTargetException;
 
+import javax.swing.JTree;
+
 import animation.AlgorithmStage;
 import animation.PseudoCodeNode;
 import graph.LayeredGraphNode;
@@ -57,17 +59,17 @@ public class ExtremalLayoutCalc implements AlgorithmStage {
 	}
 
     @Override
-    public PseudoCodeNode createPseudocodeTree() {
+    public PseudoCodeNode createPseudocodeTree( JTree tree ) {
         if( type == LayoutType.TOP_BOTTOM_LEFT )
-            pseudoCode = new PseudoCodeNode( "Extremal layout: leftmost upper" );
+            pseudoCode = new PseudoCodeNode( "Extremal layout: leftmost upper", tree );
         if( type == LayoutType.TOP_BOTTOM_RIGHT )
-            pseudoCode = new PseudoCodeNode( "Extremal layout: rightmost upper'" );
+            pseudoCode = new PseudoCodeNode( "Extremal layout: rightmost upper'", tree );
         if( type == LayoutType.BOTTOM_TOP_LEFT )
-            pseudoCode = new PseudoCodeNode( "Extremal layout: leftmost lower'" );;
+            pseudoCode = new PseudoCodeNode( "Extremal layout: leftmost lower'", tree );;
         if( type == LayoutType.BOTTOM_TOP_RIGHT )
-            pseudoCode = new PseudoCodeNode( "Extremal layout: rightmost lower'" );
-        bcNode = bc.createPseudocodeTree();
-        cpNode = cp.createPseudocodeTree();
+            pseudoCode = new PseudoCodeNode( "Extremal layout: rightmost lower'", tree );
+        bcNode = bc.createPseudocodeTree( tree );
+        cpNode = cp.createPseudocodeTree( tree );
         pseudoCode.add( bcNode );
         pseudoCode.add( cpNode );
         return pseudoCode;

+ 24 - 42
src/view/MainView.java

@@ -14,7 +14,6 @@ import java.awt.event.ComponentEvent;
 import java.awt.event.FocusEvent;
 import java.awt.event.FocusListener;
 import java.awt.event.KeyEvent;
-import java.awt.event.KeyListener;
 
 import javax.swing.JButton;
 import javax.swing.JDialog;
@@ -28,6 +27,7 @@ import javax.swing.JTextField;
 import javax.swing.JTree;
 import javax.swing.event.DocumentEvent;
 import javax.swing.event.DocumentListener;
+import javax.swing.tree.DefaultTreeModel;
 
 import animation.Action;
 import animation.AnimationController;
@@ -37,7 +37,6 @@ import graph.InitializeNodePositions;
 import graph.LayeredGraphEdge;
 import graph.LayeredGraphNode;
 import graph.RandomGraphGenerator;
-import graph.io.Writer;
 import lib.SweepCrossingMinimizer;
 
 /**
@@ -52,6 +51,7 @@ public class MainView {
      * The 'frame' of the main window.
      * The reason why there can only be one instance of this class.
      */
+    private static int frameCounter = 0;
     private JFrame frame;
 	private AnimationController controller;
     private JButton stepForward;
@@ -67,7 +67,7 @@ public class MainView {
     private JButton randomGraph;
     private JLabel delayText;
     private JTextField delay;
-    public static JTree pseudoTree;
+    public JTree pseudoTree;
     private LayeredGraphNode graph;
 	
 	private String strToLen( String s, int l )
@@ -141,15 +141,26 @@ public class MainView {
 	 */
 	public MainView( LayeredGraphNode graph )
 	{
+	    frameCounter++;
 	    this.graph = graph;
         controller = new AnimationController();
         controller.setTimeBetween( 50 );
         frame = new JFrame();
+        frame.addWindowListener(new java.awt.event.WindowAdapter() {
+            @Override
+            public void windowClosing(java.awt.event.WindowEvent windowEvent) {
+                frameCounter--;
+                if( frameCounter == 0 )
+                    System.exit( 0 );
+            }
+        });
+        
         BKNodePlacement algorithm = new BKNodePlacement( controller, graph, frame );
         
         // Create Menu GUI
 	    stepForward = new NiceButton( "stepForward" );
 	    stepForward.setLocation( 10, 10 );
+	    stepForward.setMnemonic( KeyEvent.VK_DOWN );
 	    stepForward.addActionListener( new ActionListener() {
 
             @Override
@@ -161,6 +172,7 @@ public class MainView {
         });
 	    stepForwardInto = new NiceButton( "stepForwardInto" );
 	    stepForwardInto.setLocation( 60, 10 );
+	    stepForwardInto.setMnemonic( KeyEvent.VK_RIGHT );
 	    stepForwardInto.addActionListener( new ActionListener() {
 
             @Override
@@ -183,6 +195,7 @@ public class MainView {
         });
         runForward = new NiceButton( "runForward" );
         runForward.setLocation( 160, 10 );
+        runForward.setMnemonic( KeyEvent.VK_P );
         runForward.addActionListener( new ActionListener() {
 
             @Override
@@ -194,6 +207,7 @@ public class MainView {
         });
         runBackward = new NiceButton( "runBackward" );
         runBackward.setLocation( 160, 60 );
+        runBackward.setMnemonic( KeyEvent.VK_R );
         runBackward.addActionListener( new ActionListener() {
 
             @Override
@@ -205,6 +219,7 @@ public class MainView {
         });
         stepBackward = new NiceButton( "stepBackward" );
         stepBackward.setLocation( 10, 60 );
+        stepBackward.setMnemonic( KeyEvent.VK_UP );
         stepBackward.addActionListener( new ActionListener() {
 
             @Override
@@ -216,6 +231,7 @@ public class MainView {
         });
         stepBackwardInto = new NiceButton( "stepBackwardInto" );
         stepBackwardInto.setLocation( 60, 60 );
+        stepBackwardInto.setMnemonic( KeyEvent.VK_LEFT );
         stepBackwardInto.addActionListener( new ActionListener() {
 
             @Override
@@ -248,6 +264,7 @@ public class MainView {
         });
         debug = new NiceButton( "debug" );
         debug.setLocation( 350, 10 );
+        debug.setMnemonic( KeyEvent.VK_D );
         debug.addActionListener( new ActionListener() {
 
             @Override
@@ -256,7 +273,7 @@ public class MainView {
             }
             
         });
-        randomGraph = new NiceButton( "randomGraph" );
+        randomGraph = new NiceButton( "random" );
         randomGraph.setLocation( 350, 60 );
         randomGraph.addActionListener( new ActionListener() {
 
@@ -589,7 +606,8 @@ public class MainView {
             }
             
         });
-        pseudoTree = new JTree( algorithm.createPseudocodeTree() );
+        pseudoTree = new JTree();
+        pseudoTree.setModel( new DefaultTreeModel( algorithm.createPseudocodeTree( pseudoTree ) ) );
         pseudoTree.setCellRenderer( new PseudoCodeRenderer() );
         pseudoTree.setSelectionModel( null );
         JScrollPane treeView = new JScrollPane( pseudoTree );
@@ -597,45 +615,9 @@ public class MainView {
         
         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 );
-		frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
+		frame.setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );
 		frame.setVisible( true );
 		
-		frame.addKeyListener( new KeyListener() {
-
-            @Override
-            public void keyTyped(KeyEvent e) {
-                // TODO Auto-generated method stub
-                
-            }
-
-            @Override
-            public void keyPressed(KeyEvent e) {
-                if( e.getKeyCode() == KeyEvent.VK_S )
-                {
-                    Writer w = new Writer( "save.json" );
-                    w.writeOutputGraph( graph );
-                }
-                if( e.getKeyCode() == KeyEvent.VK_LEFT )
-                	controller.setNextAction( Action.BACKWARD );
-                if( e.getKeyCode() == KeyEvent.VK_RIGHT )
-                	controller.setNextAction( Action.FORWARD );
-                if( e.getKeyCode() == KeyEvent.VK_P )
-                	controller.setContinuous( !controller.isContinuous() );
-        		frame.validate();
-        		if( e.getKeyCode() == KeyEvent.VK_D )
-        		{
-        		    System.out.println( debugInfo() );
-        		}
-            }
-
-            @Override
-            public void keyReleased(KeyEvent e) {
-                // TODO Auto-generated method stub
-                
-            }
-		    
-		});
-		
 		JLayeredPane layne = new JLayeredPane();
 		JPanel pl = new JPanel();
 		GridLayout grout = new GridLayout( 2, 2, 10, 10 );