/* File: BeliefMenuBar.java
 * Author: Jason Gookins
 * Description: This class builds the menu bar used in the Belief window.
 */

import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import javax.swing.ButtonGroup;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.KeyStroke;

public class BeliefMenuBar extends JMenuBar
{
	/************************
	 ** Instance Variables **
	 ************************/

	private BeliefListener beliefListener;
	private JMenuItem saveNetworkMenuItem;
	private JMenuItem saveAsNetworkMenuItem;
	private JMenuItem runNetworkMenuItem;
	private JMenuItem resetNetworkMenuItem;
	private JMenu viewMenu;
	private ButtonGroup viewGroup;
	private ArrayList<JRadioButtonMenuItem> viewMenuItems;



	/**********************
	 ** Main Constructor **
	 **********************/

	public BeliefMenuBar(BeliefListener beliefListener)
	{
		this.beliefListener = beliefListener;
		this.viewMenuItems = new ArrayList<JRadioButtonMenuItem>();

		JMenu fileMenu = new JMenu("File");
		fileMenu.setMnemonic(KeyEvent.VK_F);

		JMenuItem newNetworkMenuItem = new JMenuItem("New Network");
		newNetworkMenuItem.setMnemonic(KeyEvent.VK_N);
		newNetworkMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, ActionEvent.CTRL_MASK));
		newNetworkMenuItem.setActionCommand("newNetworkMenuItem");
		newNetworkMenuItem.addActionListener(beliefListener);
		fileMenu.add(newNetworkMenuItem);

		JMenuItem openNetworkMenuItem = new JMenuItem("Open Network");
		openNetworkMenuItem.setMnemonic(KeyEvent.VK_O);
		openNetworkMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, ActionEvent.CTRL_MASK));
		openNetworkMenuItem.setActionCommand("openNetworkMenuItem");
		openNetworkMenuItem.addActionListener(beliefListener);
		fileMenu.add(openNetworkMenuItem);

		saveNetworkMenuItem = new JMenuItem("Save Network");
		saveNetworkMenuItem.setMnemonic(KeyEvent.VK_S);
		saveNetworkMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, ActionEvent.CTRL_MASK));
		saveNetworkMenuItem.setEnabled(false);
		saveNetworkMenuItem.setActionCommand("saveNetworkMenuItem");
		saveNetworkMenuItem.addActionListener(beliefListener);
		fileMenu.add(saveNetworkMenuItem);

		saveAsNetworkMenuItem = new JMenuItem("Save As...");
		saveAsNetworkMenuItem.setEnabled(false);
		saveAsNetworkMenuItem.setActionCommand("saveAsNetworkMenuItem");
		saveAsNetworkMenuItem.addActionListener(beliefListener);
		fileMenu.add(saveAsNetworkMenuItem);

		fileMenu.addSeparator();

		JMenuItem exitBeliefMenuItem = new JMenuItem("Exit Belief");
		exitBeliefMenuItem.setMnemonic(KeyEvent.VK_X);
		exitBeliefMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.CTRL_MASK));
		exitBeliefMenuItem.setActionCommand("exitBeliefMenuItem");
		exitBeliefMenuItem.addActionListener(beliefListener);
		fileMenu.add(exitBeliefMenuItem);
		this.add(fileMenu);

		JMenu editMenu = new JMenu("Edit");
		editMenu.setMnemonic(KeyEvent.VK_E);

		JMenuItem addNodesMenuItem = new JMenuItem("Add Nodes");
		addNodesMenuItem.setMnemonic(KeyEvent.VK_D);
		addNodesMenuItem.setActionCommand("addNodesMenuItem");
		addNodesMenuItem.addActionListener(beliefListener);
		editMenu.add(addNodesMenuItem);

		editMenu.addSeparator();

		viewMenu = new JMenu("View");
		viewGroup = new ButtonGroup();
		viewMenu.addSeparator();
		JMenuItem addNewViewMenuItem = new JMenuItem("Add View");
		addNewViewMenuItem.setActionCommand("addNewViewMenuItem");
		addNewViewMenuItem.addActionListener(beliefListener);
		viewMenu.add(addNewViewMenuItem);
		JMenuItem deleteViewMenuItem = new JMenuItem("Delete View");
		deleteViewMenuItem.setActionCommand("deleteViewMenuItem");
		deleteViewMenuItem.addActionListener(beliefListener);
		viewMenu.add(deleteViewMenuItem);
		editMenu.add(viewMenu);
		this.add(editMenu);

		JMenu runMenu = new JMenu("Run");
		runMenu.setMnemonic(KeyEvent.VK_R);

		runNetworkMenuItem = new JMenuItem("Run Network");
		runNetworkMenuItem.setMnemonic(KeyEvent.VK_U);
		runNetworkMenuItem.setEnabled(false);
		runNetworkMenuItem.setActionCommand("runNetworkMenuItem");
		runNetworkMenuItem.addActionListener(beliefListener);
		runMenu.add(runNetworkMenuItem);

		runMenu.addSeparator();

		resetNetworkMenuItem = new JMenuItem("Reset Network");
		resetNetworkMenuItem.setMnemonic(KeyEvent.VK_T);
		resetNetworkMenuItem.setEnabled(false);
		resetNetworkMenuItem.setActionCommand("resetNetworkMenuItem");
		resetNetworkMenuItem.addActionListener(beliefListener);
		runMenu.add(resetNetworkMenuItem);
		this.add(runMenu);

		JMenu helpMenu = new JMenu("Help");
		helpMenu.setMnemonic(KeyEvent.VK_H);

		JMenuItem helpTopicsMenuItem = new JMenuItem("Help Topics");
		helpTopicsMenuItem.setMnemonic(KeyEvent.VK_L);
		helpTopicsMenuItem.setActionCommand("helpTopicsMenuItem");
		helpTopicsMenuItem.addActionListener(beliefListener);
		helpMenu.add(helpTopicsMenuItem);

		helpMenu.addSeparator();

		JMenuItem aboutBeliefMenuItem = new JMenuItem("About Belief");
		aboutBeliefMenuItem.setMnemonic(KeyEvent.VK_A);
		aboutBeliefMenuItem.setActionCommand("aboutBeliefMenuItem");
		aboutBeliefMenuItem.addActionListener(beliefListener);
		helpMenu.add(aboutBeliefMenuItem);
		this.add(helpMenu);
	}



	/***************
	 ** Accessors **
	 ***************/

	public JMenuItem getSaveNetworkMenuItem()
	{
		return this.saveNetworkMenuItem;
	}

	public JMenuItem getSaveAsNetworkMenuItem()
	{
		return this.saveAsNetworkMenuItem;
	}

	public JMenuItem getRunNetworkMenuItem()
	{
		return this.runNetworkMenuItem;
	}

	public JMenuItem getResetNetworkMenuItem()
	{
		return this.resetNetworkMenuItem;
	}



	/********************
	 ** Helper Methods **
	 ********************/

	public void addNewViewMenuItem(View view)
	{
		JRadioButtonMenuItem newViewMenuItem = new JRadioButtonMenuItem(view.getName());

		newViewMenuItem.setActionCommand(view.getName() + "View");
		newViewMenuItem.addActionListener(beliefListener);
		viewGroup.add(newViewMenuItem);
		viewMenuItems.add(newViewMenuItem);
		newViewMenuItem.setSelected(true);
		beliefListener.setCurrentView(view);
		viewMenu.add(newViewMenuItem, viewMenu.getItemCount() - 3);
	}

	public void removeViewMenuItem(View view)
	{
		for (int i = 0; i < viewMenuItems.size(); i++)
		{
			if (viewMenuItems.get(i).getText().equals(view.getName()))
			{
				if (viewMenuItems.get(i).isSelected())
				{
					viewMenuItems.get(0).setSelected(true);
				}

				viewMenu.remove(viewMenuItems.get(i));
				viewMenuItems.remove(i);

				break;
			}
		}
	}
}
