/* File: Belief.java
 * Author: Jason Gookins
 * Description: This class is the main class of Belief. It instantiates the main applet as a new runnable thread.
 * Modification Instructions:
 * 1.) Un-comment "import javax.swing.JApplet"
 * 2.) Comment out "import javax.swing.JFrame"
 * 3.) Comment out "public class Belief extends JFrame implements Runnable"
 * 4.) Un-comment "public class Belief extends JApplet"
 * 5.) Comment out the first four (4) lines of the constructor (the four method calls starting with the word "set").
 * 6.) Comment out the "run" method.
 * 7.) Comment out the "main" method.
 * 8.) Un-comment the "init" method.
 */

import java.awt.AWTEvent;
import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.util.ArrayList;
//import javax.swing.JApplet;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

public class Belief extends JFrame implements Runnable
//public class Belief extends JApplet
{
	/************************
	 ** Instance Variables **
	 ************************/

	private BeliefListener beliefListener;
	private BeliefMenuBar beliefMenuBar;
	private LoginPane loginPane;
	private UserChoicePane userChoicePane;
	private ToolPane toolPane;
	private ChangePasswordPane changePasswordPane;
	private AdminChoicePane adminChoicePane;
	private AddUserPane addUserPane;
	private EditUserPane editUserPane;
	private DeleteUserPane deleteUserPane;
	private EditPermissionsPane editPermissionsPane;
	private EventPane firstEventPane;
	private EventPane secondEventPane;

	private String currentUser;



	/**********************
	 ** Main Constructor **
	 **********************/

	public Belief()
	{
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setPreferredSize(new Dimension(800, 600));
		setMinimumSize(new Dimension(800, 600));
		setTitle("Belief - Web-based Bayesian Network Tool");

		beliefListener = new BeliefListener(this);

		beliefMenuBar = new BeliefMenuBar(beliefListener);
		beliefMenuBar.setVisible(false);
		setJMenuBar(beliefMenuBar);

		JPanel contentPane = new JPanel(new CardLayout());

		loginPane = new LoginPane(this);
		contentPane.add(loginPane, "loginPane");

		userChoicePane = new UserChoicePane(this);
		contentPane.add(userChoicePane, "userChoicePane");

		toolPane = new ToolPane(this);
		contentPane.add(toolPane, "toolPane");

		changePasswordPane = new ChangePasswordPane(this);
		contentPane.add(changePasswordPane, "changePasswordPane");

		adminChoicePane = new AdminChoicePane(this);
		contentPane.add(adminChoicePane, "adminChoicePane");

		addUserPane = new AddUserPane(this);
		contentPane.add(addUserPane, "addUserPane");

		editUserPane = new EditUserPane(this);
		contentPane.add(editUserPane, "editUserPane");

		deleteUserPane = new DeleteUserPane(this);
		contentPane.add(deleteUserPane, "deleteUserPane");

		editPermissionsPane = new EditPermissionsPane(this);
		contentPane.add(editPermissionsPane, "editPermissionsPane");
		
		setContentPane(contentPane);

		beliefListener.setListenerTargets();

		firstEventPane = new EventPane();
		firstEventPane.setVisible(false);
		getRootPane().getLayeredPane().add(firstEventPane, new Integer(0));

		secondEventPane = new EventPane();
		secondEventPane.setVisible(false);
		getRootPane().getLayeredPane().add(secondEventPane, new Integer(2));

		getRootPane().getLayeredPane().addComponentListener(new ComponentAdapter()
		{
			public void componentResized(ComponentEvent evt)
			{
				resizeEventPanes();
			}
		});

		pack();
	}



	/***************
	 ** Accessors **
	 ***************/

	public BeliefListener getBeliefListener()
	{
		return this.beliefListener;
	}

	public BeliefMenuBar getBeliefMenuBar()
	{
		return this.beliefMenuBar;
	}

	public LoginPane getLoginPane()
	{
		return this.loginPane;
	}

	public ToolPane getToolPane()
	{
		return this.toolPane;
	}

	public ChangePasswordPane getChangePasswordPane()
	{
		return this.changePasswordPane;
	}

	public AddUserPane getAddUserPane()
	{
		return this.addUserPane;
	}

	public EditUserPane getEditUserPane()
	{
		return this.editUserPane;
	}

	public DeleteUserPane getDeleteUserPane()
	{
		return this.deleteUserPane;
	}

	public EditPermissionsPane getEditPermissionsPane()
	{
		return this.editPermissionsPane;
	}

	public EventPane getFirstEventPane()
	{
		return this.firstEventPane;
	}

	public EventPane getSecondEventPane()
	{
		return this.secondEventPane;
	}

	public String getCurrentUser()
	{
		return this.currentUser;
	}



	/**************
	 ** Mutators **
	 **************/

	public void setCurrentUser(String newCurrentUser)
	{
		this.currentUser = newCurrentUser;
	}



	/****************
	 ** Run Method **
	 ****************/

	public void run()
	{
		setVisible(true);
		setLocationRelativeTo(null);
	}



	/*****************
	 ** Main Method **
	 *****************/

	public static void main(String[] args)
	{
		SwingUtilities.invokeLater(new Belief());
	}

	/*public void init()
	{
		try
		{
			SwingUtilities.invokeAndWait(new Runnable()
			{
				public void run()
				{
					Belief belief = new Belief();
				}
			});
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}*/



	/**********************
	 ** Instance Methods **
	 **********************/

	public void logIn(String username)
	{
		View currentView = new View(username);

		setCurrentUser(username);
		beliefMenuBar.clearViews();
		beliefListener.setViews(new ArrayList<View>());
		beliefListener.getViews().add(currentView);
		beliefMenuBar.addNewViewMenuItem(currentView);
		beliefMenuBar.selectFirstView();
		toolPane.getNetworkLabel().setText("Unnamed Network");
	}

	private void resizeEventPanes()
	{
		firstEventPane.setBounds(0, 0, getWidth(), getHeight());
		secondEventPane.setBounds(0, 0, getWidth(), getHeight());
	}



	/**********************
	 ** Internal Classes **
	 **********************/

	public class EventPane extends JPanel
	{
		public EventPane()
		{
			setOpaque(false);
			setFocusable(false);

			enableEvents(AWTEvent.KEY_EVENT_MASK);
			enableEvents(AWTEvent.MOUSE_EVENT_MASK);
			enableEvents(AWTEvent.MOUSE_MOTION_EVENT_MASK);
			enableEvents(AWTEvent.MOUSE_WHEEL_EVENT_MASK);
		}
	}
}