/*
 * SimLiberu.java
 *
 * Created on 30 of August 2005, 2:05
 */
/**
 *
 * @author  Eng. Paulo Roque Silva
 */
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class SimLiberu extends JFrame {
    
    public static final long    serialVersionUID = 10072010L; // SimLiberu Version
    Interface       control; 		// Human control interface
    PlayLiberu      runUniverse;    // execute the simulation of the robot (body+brain) and the world
    boolean			executed,		// true if under execution
             		stopped,		// true if stopped, so I can save and load
             		newUniverse;	// true if aWorld initialized
    JPanel          panel;          // Learning Window
    JTextField      text;           // learned text
    
    /** Creates new form SimLiberu */
    public SimLiberu() {
        int screenWidth;
        int screenHeight;
        
        // Get Screen dimensions
        Toolkit kit = Toolkit.getDefaultToolkit();
        Dimension screenSize = kit.getScreenSize();
        screenWidth = screenSize.width;
        screenHeight = screenSize.height;
        // Center frame in Screen
        setLocation( screenWidth / 8, screenHeight / 8 );
        // Set frame icon
        Image img = kit.getImage("Brain.gif");
        setIconImage(img);

        control     = new Interface();
        executed    = false;
 		stopped     = true;
 		newUniverse = true;
        
        initComponents();
        
        setSize( screenWidth * 3 / 4, screenHeight * 3 / 4);

	    text         = new JTextField(6);
	    text.setText("Random...");
        runUniverse = new PlayLiberu(control, text);
        runUniverse.display(false);
        
        getContentPane().add(control, BorderLayout.CENTER);

	    panel        = new JPanel();
		panel.add(text);
        getContentPane().add(panel, BorderLayout.EAST);
    }
    
    private void initComponents() {
//        jPopupMenu1 = new javax.swing.JPopupMenu();
        jPanel1     = new JPanel();
        jButton1    = new JButton();
        jButton2    = new JButton();
        jButton3    = new JButton();
        jButton4    = new JButton();
        jButton5    = new JButton();
        jMenuBar1   = new JMenuBar();
        jMenu1      = new JMenu();
        jMenu2      = new JMenu();
        jMenu3      = new JMenu();
        jMenuItem1  = new JMenuItem();
        jMenuItem2  = new JMenuItem();
        jMenuItem3  = new JMenuItem();
        jMenuItem21 = new JMenuItem();
        jMenuItem31 = new JMenuItem();
        jSeparator1 = new JSeparator();
        jMenuItem4  = new JMenuItem();

        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setTitle("SimLiberu 2012 [Vital inside]- elegans robot [Liberu]");
        
        jButton1.setText("Play");
        jButton1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                playAction(evt);
            }
        });
        jPanel1.add(jButton1);

        jButton2.setText("Stop");
        jButton2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                stopAction(evt);
            }
        });
        jPanel1.add(jButton2);

        jButton3.setText("Pause");
        jButton3.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                pauseAction(evt);
            }
        });
        jPanel1.add(jButton3);

        jButton4.setText("Step");
        jButton4.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                stepAction(evt);
            }
        });
        jPanel1.add(jButton4);

        jButton5.setText("Continue");
        jButton5.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                continueAction(evt);
            }
        });
        jPanel1.add(jButton5);

        getContentPane().add(jPanel1, BorderLayout.NORTH);

        jMenu1.setText("File");
        jMenuItem1.setText("New");
        jMenuItem1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                newAction(evt);
            }
        });
        jMenu1.add(jMenuItem1);

        jMenuItem2.setText("Open...");
        jMenuItem2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                openAction(evt);
            }
        });
        jMenu1.add(jMenuItem2);

        jMenuItem3.setText("Save");
        jMenuItem3.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                saveAction(evt);
            }
        });
        jMenu1.add(jMenuItem3);

        jMenu1.add(jSeparator1);

        jMenuItem4.setText("Exit");
        jMenuItem4.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                exitAction(evt);
            }
        });
        jMenu1.add(jMenuItem4);
        jMenuBar1.add(jMenu1);

        jMenu2.setText("Edit"); 
        jMenuItem21.setText("Parameters..."); 
        jMenuItem21.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                parametersAction(evt);
            }
        });
        jMenu2.add(jMenuItem21);
        jMenuBar1.add(jMenu2);

        jMenu3.setText("Help"); 
        jMenuItem31.setText("Version..."); 
        jMenuItem31.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                versionAction(evt);
            }
        });
        jMenu3.add(jMenuItem31);
        jMenuBar1.add(jMenu3);

        setJMenuBar(jMenuBar1);

        pack();
    }

    private void newAction(ActionEvent evt) {
    	
    	runUniverse = new PlayLiberu(control, text);
    	if (stopped) {
            runUniverse.display(false);
            newUniverse = true;
            JOptionPane.showMessageDialog(null, "New Universe...", "Information",
                JOptionPane.INFORMATION_MESSAGE);
        }
    }

    private void continueAction(ActionEvent evt) {

    	if (executed) {
            stopped = false;
            runUniverse.continueRun();
        }
    }

    private void stepAction(ActionEvent evt) {

    	if (executed) runUniverse.oneStep();
        else {
            if (newUniverse) {
                executed = true;
                runUniverse.step(true);
                runUniverse.setDaemon(true);
                runUniverse.start();
                newUniverse = false;
            }
        }
        stopped = true;
    }

    private void pauseAction(ActionEvent evt) {

    	// CAN'T run without <Play> pressed first
        if (executed) {
            runUniverse.pause();
            stopped = true;
        }
    }

    private void exitAction(ActionEvent evt) {

    	if (executed) {
        	runUniverse.liberu.endLiberu(true);
            runUniverse.setToEnd();                // Set free the nodes to finishing
            runUniverse.interrupt();
        }
        System.out.println("END...SimLiberu...bye bye");
        System.exit(0);
    }

    private void saveAction(ActionEvent evt) {

    	if (stopped) {
            runUniverse.liberu.saveLiberu();
            JOptionPane.showMessageDialog(null, "Liberu Saved...",
                "Information", JOptionPane.INFORMATION_MESSAGE); 
        }
    }

    private void openAction(ActionEvent evt) {

    	if (stopped) {
            runUniverse = new PlayLiberu(control, text);
            runUniverse.liberu.loadRobot();
            runUniverse.liberu.endLiberu(false);
            runUniverse.display(true);
            JOptionPane.showMessageDialog(null, "New Universe with the Liberu loaded...",
                "Information", JOptionPane.INFORMATION_MESSAGE); 
            newUniverse = true;
        }
    }

    private void stopAction(ActionEvent evt) {

    	if (executed) {
            if (JOptionPane.showConfirmDialog(null,
                    "The Simulation is going to End...", "Alert",
                    JOptionPane.OK_CANCEL_OPTION) == JOptionPane.OK_OPTION) {
            	runUniverse.liberu.endLiberu(true);
                runUniverse.setToEnd();                  // Free nodes to be finishing
                runUniverse.interrupt();
                executed = false;
                stopped = true;
            }
        }
    }

    private void playAction(ActionEvent evt) {

    	if (!executed && newUniverse) {
            executed = true;
            stopped = false;
            runUniverse.step(false);
            runUniverse.setDaemon(true);
            runUniverse.start();
            runUniverse.display(true);
            newUniverse = false;
        }
    }
    
    private void parametersAction(ActionEvent evt) {

        JOptionPane.showMessageDialog(null, "Random... [d-drink; e-eat; w-walk; l-Turn left; r-Turn right]", "Information",
                JOptionPane.INFORMATION_MESSAGE);
    }

    private void versionAction(ActionEvent evt) {

        JOptionPane.showMessageDialog(null, "Liberu, by Eng. Paulo Roque Silva... 2004/2012", "Information",
                JOptionPane.INFORMATION_MESSAGE);
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {

    	EventQueue.invokeLater(new Runnable() {
    		public void run() {
            	new SimLiberu().setVisible(true);
            }
        });
    }
    
    private JButton    jButton1;
    private JButton    jButton2;
    private JButton    jButton3;
    private JButton    jButton4;
    private JButton    jButton5;
    private JMenu      jMenu1;
    private JMenu      jMenu2;
    private JMenu      jMenu3;
    private JMenuBar   jMenuBar1;
    private JMenuItem  jMenuItem1;
    private JMenuItem  jMenuItem2;
    private JMenuItem  jMenuItem3;
    private JMenuItem  jMenuItem4;
    private JMenuItem  jMenuItem21;
    private JMenuItem  jMenuItem31;
    private JPanel     jPanel1;
    private JSeparator jSeparator1;
}
