/* 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 JMenu fileMenu;
	private JMenuItem saveNetworkMenuItem;
	private JMenuItem saveAsNetworkMenuItem;
	private JMenuItem exportNetworkMenuItem;
	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>();

		fileMenu = new JMenu("File");

		JMenuItem newNetworkMenuItem = new JMenuItem("New Network");
		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.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, ActionEvent.CTRL_MASK));
		openNetworkMenuItem.setActionCommand("openNetworkMenuItem");
		openNetworkMenuItem.addActionListener(beliefListener);
		fileMenu.add(openNetworkMenuItem);

		saveNetworkMenuItem = new JMenuItem("Save Network");
		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 importNetworkMenuItem = new JMenuItem("Import Network");
		importNetworkMenuItem.setActionCommand("importNetworkMenuItem");
		importNetworkMenuItem.addActionListener(beliefListener);
		fileMenu.add(importNetworkMenuItem);

		exportNetworkMenuItem = new JMenuItem("Export Network");
		exportNetworkMenuItem.setEnabled(false);
		exportNetworkMenuItem.setActionCommand("exportNetworkMenuItem");
		exportNetworkMenuItem.addActionListener(beliefListener);
		fileMenu.add(exportNetworkMenuItem);

		fileMenu.addSeparator();

		JMenuItem logOutMenuItem = new JMenuItem("Log Out");
		logOutMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.CTRL_MASK));
		logOutMenuItem.setActionCommand("logOutMenuItem");
		logOutMenuItem.addActionListener(beliefListener);
		fileMenu.add(logOutMenuItem);
		this.add(fileMenu);

		JMenu editMenu = new JMenu("Edit");

		JMenuItem addNodesMenuItem = new JMenuItem("Add Nodes");
		addNodesMenuItem.setActionCommand("addNodesMenuItem");
		addNodesMenuItem.addActionListener(beliefListener);
		editMenu.add(addNodesMenuItem);

		editMenu.addSeparator();

		viewMenu = new JMenu("View");
		viewGroup = new ButtonGroup();
		editMenu.add(viewMenu);
		this.add(editMenu);

		JMenu runMenu = new JMenu("Run");

		runNetworkMenuItem = new JMenuItem("Run Network");
		runNetworkMenuItem.setEnabled(false);
		runNetworkMenuItem.setActionCommand("runNetworkMenuItem");
		runNetworkMenuItem.addActionListener(beliefListener);
		runMenu.add(runNetworkMenuItem);

		runMenu.addSeparator();

		resetNetworkMenuItem = new JMenuItem("Reset Network");
		resetNetworkMenuItem.setEnabled(false);
		resetNetworkMenuItem.setActionCommand("resetNetworkMenuItem");
		resetNetworkMenuItem.addActionListener(beliefListener);
		runMenu.add(resetNetworkMenuItem);
		this.add(runMenu);

		JMenu helpMenu = new JMenu("Help");

		JMenuItem helpTopicsMenuItem = new JMenuItem("Help Topics");
		helpTopicsMenuItem.setEnabled(false);
		helpTopicsMenuItem.setActionCommand("helpTopicsMenuItem");
		helpTopicsMenuItem.addActionListener(beliefListener);
		helpMenu.add(helpTopicsMenuItem);

		helpMenu.addSeparator();

		JMenuItem aboutBeliefMenuItem = new JMenuItem("About Belief");
		aboutBeliefMenuItem.setActionCommand("aboutBeliefMenuItem");
		aboutBeliefMenuItem.addActionListener(beliefListener);
		helpMenu.add(aboutBeliefMenuItem);
		this.add(helpMenu);
	}



	/***************
	 ** Accessors **
	 ***************/

	public JMenu getFileMenu()
	{
		return this.fileMenu;
	}

	public JMenuItem getSaveNetworkMenuItem()
	{
		return this.saveNetworkMenuItem;
	}

	public JMenuItem getSaveAsNetworkMenuItem()
	{
		return this.saveAsNetworkMenuItem;
	}

	public JMenuItem getExportNetworkMenuItem()
	{
		return this.exportNetworkMenuItem;
	}

	public JMenuItem getRunNetworkMenuItem()
	{
		return this.runNetworkMenuItem;
	}

	public JMenuItem getResetNetworkMenuItem()
	{
		return this.resetNetworkMenuItem;
	}



	/**********************
	 ** Instance 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);
		beliefListener.setCurrentView(view);
		viewMenu.add(newViewMenuItem);
	}

	public void selectFirstView()
	{
		viewMenuItems.get(0).setSelected(true);
	}

	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;
			}
		}
	}

	public void clearViews()
	{
		for (int i = viewMenuItems.size() - 1; i >= 0; i--)
		{
			viewMenu.remove(viewMenuItems.get(i));
			viewMenuItems.remove(i);
		}
	}
}