package sortingstuff;

//  @Author Damien Bell
import java.awt.Color;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.Timer;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import java.util.Random;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.Thread;


public class SortingStuff extends JFrame{
    public SortingStuff(){
        initUI();
    }
    
public static class thread2 implements Runnable{
    private String numbers[];
    private JButton numButton[];
    
    public thread2(String[] numbers1, JButton[] numButton1){
        numbers = numbers1;
        numButton = numButton1;
    }
    public void doSort(String[] numbers, JButton[] numButton){
        System.out.println(Thread.currentThread().getName());
        Sort.bubbleSort(numbers, numButton);
    }
    
    public void run() {
        doSort(numbers, numButton);
    }
}

JButton numButton[] = new JButton[12];
String numbers[] = new String[12];
JLabel spacer[]= new JLabel[10];
JButton Bubble = new JButton();
JButton Merge = new JButton();
JButton Insertion = new JButton();
JButton Heap = new JButton();
JButton MergeSort = new JButton();
JButton Randomize = new JButton();
    
public final void genRandom(String strArray[]){
    Random generator = new Random();
    for(int i=0; i<strArray.length; i++){
        strArray[i] = Integer.toString(Math.abs(generator.nextInt()%100)); 
    }
}    

public final void genReRandom(String numbers[], JButton numButton[]){
    Random generator = new Random();
    for(int i=0; i<numButton.length; i++){
        String str1=Integer.toString(Math.abs(generator.nextInt()%100));
        numButton[i].setText(str1); 
        numbers[i]=str1;
    }
}  
    
public final void initUI(){
      JPanel panel = new JPanel();
      getContentPane().add(panel);
      panel.setBorder(BorderFactory.createEmptyBorder(2,12,4,5));
      panel.setLayout(new GridLayout(2,12,4,5));
      
      genRandom(numbers);
      System.out.println(Thread.currentThread().getName());
      for(int i=0; i<numbers.length; i++){
          numButton[i] = new JButton();
          numButton[i].setText(numbers[i]);
          panel.add(numButton[i]);
      }
      for(int i=0; i<3; i++){
          spacer[i] = new JLabel();
          spacer[i].setText("");
          panel.add(spacer[i]);   
      }

      Bubble.setText("<html>&nbsp;Bubble <br> <center>Sort</center></html>");
      Bubble.addActionListener(new ActionListener(){
          public void actionPerformed(ActionEvent ae){
          System.out.println("thread " +Thread.currentThread().getName());
          thread2 myThread2 = new thread2(numbers, numButton);
          new Thread(myThread2).start();
          }
      });
      panel.add(Bubble);
      
      Merge.setText("<html>&nbsp;Merge <br> <center>Sort</center></html>");
      Merge.addActionListener(new ActionListener(){
          public void actionPerformed(ActionEvent ae){
          Sort.bubbleSort(numbers, numButton);
          }
      });
      panel.add(Merge);      

      Insertion.setText("<html>&nbsp;Insertion<br> <center>Sort</center></html>");
      Insertion.addActionListener(new ActionListener(){
          public void actionPerformed(ActionEvent ae){
          Sort.bubbleSort(numbers, numButton);
          }
      });
      panel.add(Insertion); 
      
      Heap.setText("<html>&nbsp;Heap <br> <center>Sort</center></html>");
      Heap.addActionListener(new ActionListener(){
          public void actionPerformed(ActionEvent ae){
          Sort.bubbleSort(numbers, numButton);
          }
      });
      panel.add(Heap);   
      
      Randomize.setText("Randomize");
      Randomize.addActionListener(new ActionListener(){
          public void actionPerformed(ActionEvent ae){
          genReRandom(numbers, numButton);
          }
      });
      panel.add(Randomize);     
      
      for(int i=4; i<7; i++){
          spacer[i] = new JLabel();
          spacer[i].setText("");
          panel.add(spacer[i]);   
      }
      
      
      
      
      
      add(panel);
      setTitle("Test");
      setSize(1600,300);
      setLocationRelativeTo(null);
      setDefaultCloseOperation(DISPOSE_ON_CLOSE);
                
}

public static void main(String[] args){
            SwingUtilities.invokeLater(new Runnable() {
            public void run(){
                SortingStuff ss = new SortingStuff();
                ss.setVisible(true);
            }
        });  
    }
}


/////////////////////////////////////////////////////////////////

package sortingstuff;

import java.awt.Color;
import javax.swing.JButton;

public class Sort {
    public static void bubbleSort(final String numbers[], final JButton numButton[]){
       double startTime = System.nanoTime();
       System.out.println("thread " +Thread.currentThread().getName());
       for (int k = 0; k < numbers.length - 1; k++){  
       boolean isSorted = true;  
       int delay500=500,  delay750=750, delay2000=1500;
       for (int i = 1; i < numbers.length - k; i++)  {  
         numButton[i].setBackground(Color.YELLOW); 
         numButton[i-1].setBackground(Color.YELLOW);
         try{
            delay500 = doSlow.doSlow250(delay500);
            Thread.sleep(delay500);
         }catch(Exception e){ System.err.println("Error: " + e.getMessage());}
         if (Integer.parseInt(numbers[i]) < Integer.parseInt(numbers[i - 1])  ){
             
            isSorted = false;  
            try{
            String tempVariable = numbers[i];  
            numbers[i] = numbers[i - 1];  
            numbers[i - 1] = tempVariable;  
            String str1 = numButton[i].getText();
            numButton[i].setBackground(Color.RED);           
            numButton[i-1].setBackground(Color.RED);
            delay2000 = doSlow.doSlow250(delay2000);
            Thread.sleep(delay2000);
            numButton[i].setText(numButton[i-1].getText());
            numButton[i-1].setText(str1);
            numButton[i].setBackground(Color.GREEN);           
            numButton[i-1].setBackground(Color.GREEN);    
            delay750 = doSlow.doSlow250(delay2000);
            Thread.sleep(delay750);
            numButton[i].setBackground(null);           
            numButton[i-1].setBackground(null);    
            }catch(Exception e){ System.err.println("Error: " + e.getMessage());}
         }
         numButton[i].setBackground(null); 
         numButton[i-1].setBackground(null);
      }  
  
      if (isSorted){
      double endTime = System.nanoTime();
      double elapsedTime = endTime - startTime;
      System.out.println("This operation took " + elapsedTime + " nanoseconds, which is :" + ((elapsedTime/1000000)/1000) + " seconds.");
         break;  
      }
    } 
    }
}

///////////////////////////////////////


package sortingstuff;
public class doSlow {
    
public static int doSlow250(int x){
    return x;
}
    
}


/////////////////////////////////////