2020import javafx .animation .Interpolator ;
2121import javafx .animation .ScaleTransition ;
2222import javafx .animation .SequentialTransition ;
23+ import javafx .animation .StrokeTransition ;
2324import javafx .beans .value .ChangeListener ;
2425import javafx .beans .value .ObservableValue ;
2526import javafx .event .ActionEvent ;
3536import javafx .scene .control .TextInputDialog ;
3637import javafx .scene .control .ToggleGroup ;
3738import javafx .scene .effect .BlendMode ;
39+ import javafx .scene .image .Image ;
40+ import javafx .scene .image .ImageView ;
3841import javafx .scene .input .MouseButton ;
3942import javafx .scene .input .MouseEvent ;
4043import javafx .scene .layout .Pane ;
4144import javafx .scene .paint .Color ;
45+ import javafx .scene .paint .Paint ;
4246import javafx .scene .shape .Circle ;
4347import javafx .scene .shape .Line ;
48+ import javafx .scene .shape .Shape ;
4449import javafx .util .Duration ;
4550
4651public class CanvasController implements Initializable , ChangeListener {
4752
4853 @ FXML
49- private JFXButton canvasBackButton , clearButton , resetButton , gear ;
54+ private JFXButton canvasBackButton , clearButton , resetButton , gear , playPauseButton ;
5055 @ FXML
5156 private JFXToggleButton addNodeButton , addEdgeButton , bfsButton , dfsButton , dijkstraButton , articulationPointButton ;
5257 @ FXML
@@ -67,17 +72,22 @@ public class CanvasController implements Initializable, ChangeListener {
6772 private JFXNodesList nodeList ;
6873 @ FXML
6974 private JFXSlider slider ;
75+ @ FXML
76+ private ImageView playPauseImage ;
7077
7178 int nNode = 0 , time = 500 ;
7279 NodeFX selectedNode = null , articulationStart = null ;
7380 List <NodeFX > circles = new ArrayList <NodeFX >();
81+ List <Edge > mstEdges = new ArrayList <Edge >();
82+ List <Shape > edges = new ArrayList <Shape >();
7483 boolean addNode = true , addEdge = false , calculate = false ,
75- calculated = false ;
84+ calculated = false , playing = false , paused = false ;
7685 List <Label > distances = new ArrayList <Label >(), visitTime = new ArrayList <Label >(), lowTime = new ArrayList <Label >();
7786 private boolean weighted = Panel1Controller .weighted , unweighted = Panel1Controller .unweighted ,
7887 directed = Panel1Controller .directed , undirected = Panel1Controller .undirected ,
7988 bfs = true , dfs = true , dijkstra = true , articulationPoint = true ;
8089 Algorithm algo = new Algorithm ();
90+ SequentialTransition st ;
8191
8292 @ Override
8393 public void initialize (URL url , ResourceBundle rb ) {
@@ -221,11 +231,15 @@ public void handle(MouseEvent mouseEvent) {
221231 }
222232
223233 if (undirected ) {
224- selectedNode .node .adjacents .add (new Edge (circle .node , Integer .valueOf (weight .getText ())));
225- circle .node .adjacents .add (new Edge (selectedNode .node , Integer .valueOf (weight .getText ())));
234+ Edge temp = new Edge (selectedNode .node , circle .node , Integer .valueOf (weight .getText ()), edgeLine );
235+ mstEdges .add (temp );
236+ selectedNode .node .adjacents .add (new Edge (selectedNode .node , circle .node , Integer .valueOf (weight .getText ()), edgeLine ));
237+ circle .node .adjacents .add (new Edge (circle .node , selectedNode .node , Integer .valueOf (weight .getText ()), edgeLine ));
238+ edges .add (edgeLine );
226239 } else if (directed ) {
227- selectedNode .node .adjacents .add (new Edge (circle .node , Integer .valueOf (weight .getText ())));
228- circle .node .revAdjacents .add (new Edge (selectedNode .node , Integer .valueOf (weight .getText ())));
240+ selectedNode .node .adjacents .add (new Edge (selectedNode .node , circle .node , Integer .valueOf (weight .getText ()), arrow ));
241+ circle .node .revAdjacents .add (new Edge (circle .node , selectedNode .node , Integer .valueOf (weight .getText ()), arrow ));
242+ edges .add (arrow );
229243 }
230244 }
231245 if (addNode || (calculate && !calculated ) || addEdge ) {
@@ -285,7 +299,29 @@ public void handle(MouseEvent mouseEvent) {
285299 }
286300
287301 };
288- 302+ 303+ @ FXML
304+ public void PlayPauseHandle (ActionEvent event ){
305+ System .out .println ("IN PLAYPAUSE" );
306+ System .out .println (playing +" " + paused );
307+ if (playing ){
308+ Image image = new Image (getClass ().getResourceAsStream ("/play_arrow_black_48x48.png" ));
309+ playPauseImage .setImage (image );
310+ System .out .println ("Pausing" );
311+ st .pause ();
312+ paused = true ;
313+ playing = false ;
314+ return ;
315+ }
316+ if (paused ){
317+ Image image = new Image (getClass ().getResourceAsStream ("/pause_black_48x48.png" ));
318+ playPauseImage .setImage (image );
319+ st .play ();
320+ playing = true ;
321+ paused = false ;
322+ return ;
323+ }
324+ }
289325 @ FXML
290326 public void ResetHandle (ActionEvent event ) {
291327 ClearHandle (null );
@@ -312,6 +348,8 @@ public void ResetHandle(ActionEvent event) {
312348 dfsButton .setDisable (true );
313349 dijkstraButton .setDisable (true );
314350 articulationPointButton .setDisable (true );
351+ playing = false ;
352+ paused = false ;
315353 }
316354
317355 @ FXML
@@ -352,6 +390,8 @@ public void ClearHandle(ActionEvent event) {
352390 dfs = false ;
353391 articulationPoint = false ;
354392 dijkstra = false ;
393+ playing = false ;
394+ paused = false ;
355395 }
356396
357397 @ FXML
@@ -492,7 +532,7 @@ public NodeFX(double x, double y, double rad, String name) {
492532 */
493533 public class Algorithm {
494534
495- SequentialTransition st ;
535+ 496536
497537 //<editor-fold defaultstate="collapsed" desc="Dijkstra">
498538 public void newDijkstra (Node source ) {
@@ -569,6 +609,7 @@ class Dijkstra {
569609 });
570610 st .onFinishedProperty ();
571611 st .play ();
612+ playing = true ;
572613 //</editor-fold>
573614 }
574615 }
@@ -583,7 +624,7 @@ class BFS {
583624
584625 BFS (Node source ) {
585626
586- //<editor-fold defaultstate="collapsed" desc="Animation Initialize ">
627+ //<editor-fold defaultstate="collapsed" desc="Set labels and distances ">
587628 for (NodeFX n : circles ) {
588629 distances .add (n .distance );
589630 n .distance .setLayoutX (n .point .x + 20 );
@@ -614,13 +655,19 @@ class BFS {
614655 for (Edge e : u .adjacents ) {
615656 if (e != null ) {
616657 Node v = e .target ;
658+ 617659 if (!v .visited ) {
618660 v .minDistance = u .minDistance + 1 ;
619661 v .visited = true ;
620662 q .push (v );
621663 v .previous = u ;
622664
623665 //<editor-fold defaultstate="collapsed" desc="Animation Control">
666+ //<editor-fold defaultstate="collapsed" desc="Change Edge colors">
667+ StrokeTransition ftEdge = new StrokeTransition (Duration .millis (time ), e .line );
668+ ftEdge .setToValue (Color .rgb (163 , 203 , 56 ,1.0 ));
669+ st .getChildren ().add (ftEdge );
670+ //</editor-fold>
624671 FillTransition ft1 = new FillTransition (Duration .millis (time ), v .circle );
625672 ft1 .setToValue (Color .FORESTGREEN );
626673 ft1 .setOnFinished (ev -> {
@@ -646,12 +693,16 @@ class BFS {
646693 ft1 .setToValue (Color .BLACK );
647694 ft1 .play ();
648695 }
696+ for (Shape n : edges ){
697+ n .setStroke (Color .BLACK );
698+ }
649699 FillTransition ft1 = new FillTransition (Duration .millis (time ), source .circle );
650700 ft1 .setToValue (Color .RED );
651701 ft1 .play ();
652702 });
653703 st .onFinishedProperty ();
654704 st .play ();
705+ playing = true ;
655706 //</editor-fold>
656707 }
657708 }
@@ -691,12 +742,16 @@ class DFS {
691742 ft1 .setToValue (Color .BLACK );
692743 ft1 .play ();
693744 }
745+ for (Shape n : edges ){
746+ n .setStroke (Color .BLACK );
747+ }
694748 FillTransition ft1 = new FillTransition (Duration .millis (time ), source .circle );
695749 ft1 .setToValue (Color .RED );
696750 ft1 .play ();
697751 });
698752 st .onFinishedProperty ();
699753 st .play ();
754+ playing = true ;
700755 //</editor-fold>
701756 }
702757
@@ -716,8 +771,18 @@ public void DFSRecursion(Node source) {
716771 v .visited = true ;
717772 v .previous = source ;
718773// v.circle.distance.setText("Dist. : " + v.minDistance);
774+ //<editor-fold defaultstate="collapsed" desc="Change Edge colors">
775+ StrokeTransition ftEdge = new StrokeTransition (Duration .millis (time ), e .line );
776+ ftEdge .setToValue (Color .FORESTGREEN );
777+ st .getChildren ().add (ftEdge );
778+ //</editor-fold>
719779 DFSRecursion (v );
720780 //<editor-fold defaultstate="collapsed" desc="Animation Control">
781+ //<editor-fold defaultstate="collapsed" desc="Change Edge colors">
782+ StrokeTransition ftEdge1 = new StrokeTransition (Duration .millis (time ), e .line );
783+ ftEdge1 .setToValue (Color .BLUEVIOLET );
784+ st .getChildren ().add (ftEdge1 );
785+ //</editor-fold>
721786 FillTransition ft1 = new FillTransition (Duration .millis (time ), v .circle );
722787 ft1 .setToValue (Color .BLUEVIOLET );
723788 ft1 .onFinishedProperty ();
@@ -782,6 +847,9 @@ class ArticulationPoint {
782847 ft1 .setToValue (Color .BLACK );
783848 ft1 .play ();
784849 }
850+ for (Shape n : edges ){
851+ n .setStroke (Color .BLACK );
852+ }
785853 for (NodeFX n : circles ) {
786854 if (n .node .isArticulationPoint ) {
787855 FillTransition ft1 = new FillTransition (Duration .millis (time ), n );
@@ -792,6 +860,7 @@ class ArticulationPoint {
792860 });
793861 st .onFinishedProperty ();
794862 st .play ();
863+ playing = true ;
795864 //</editor-fold>
796865 }
797866
@@ -823,6 +892,11 @@ void RecAP(Node s) {
823892 if (!v .visited ) {
824893 v .previous = s ;
825894 childCount ++;
895+ //<editor-fold defaultstate="collapsed" desc="Change Edge colors">
896+ StrokeTransition ftEdge = new StrokeTransition (Duration .millis (time ), e .line );
897+ ftEdge .setToValue (Color .FORESTGREEN );
898+ st .getChildren ().add (ftEdge );
899+ //</editor-fold>
826900 RecAP (v );
827901
828902 s .lowTime = Math .min (s .lowTime , v .lowTime );
@@ -831,6 +905,11 @@ void RecAP(Node s) {
831905 }
832906
833907 //<editor-fold defaultstate="collapsed" desc="Animation Control">
908+ ///<editor-fold defaultstate="collapsed" desc="Change Edge colors">
909+ StrokeTransition ftEdge1 = new StrokeTransition (Duration .millis (time ), e .line );
910+ ftEdge1 .setToValue (Color .BLUEVIOLET );
911+ st .getChildren ().add (ftEdge1 );
912+ //</editor-fold>
834913 FillTransition ft1 = new FillTransition (Duration .millis (time ), v .circle );
835914 ft1 .setToValue (Color .BLUEVIOLET );
836915 ft1 .setOnFinished (ev -> {
0 commit comments