package Darts;

import java.awt.BorderLayout;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.SwingUtilities;

public class Darts extends JPanel implements WindowListener
	{

	//
	// Constants
	//
	private static final long serialVersionUID = 1L;
	private static final String DATA_FILENAME = "dart.dat";

	//
	// Member Data
	//
	private DartDBNode 			dartDB; // Root node to the database
	private DartTree 				dartTree; // This is a JTree
	private DartControlPanel dartControlPanel; // This is a JPanel
	private DartTable 			dartTable; // This is a JTable
	private DartBoardFrame 	dartBoard; // This is a JFrame
	private DartPlay4Scores dartPlayScores; // This is a JPanel
	private JSplitPane 			splitPane; // Main window horizontal divide

	//
	// Methods
	//

	/**
	 * Constructor
	 */
	public Darts()

		{
		// Load the Database
		dartDB = DartDBNode.loadFromFile(DATA_FILENAME);
		if (dartDB == null)
			dartDB = new DartDBNode(null); // Create the root DB node

		// Setup tree view
		dartTree = new DartTree(dartDB);
		dartTree.setEditable(true);
		//dartTree.setPreferredSize(new Dimension(300, 300));

		// Setup controls panel
		dartControlPanel = new DartControlPanel(this, dartTree);
		dartTree.addTreeSelectionListener(dartControlPanel);

		// Setup table view
		dartTable = new DartTable();
		dartTable.setOpaque(true);
		dartTree.addTreeSelectionListener(dartTable);

		// Setup the pane with the 4 scores displayed
		dartPlayScores = new DartPlay4Scores( this );
		dartPlayScores.setSize( 700, 700 );
		//dartBoard.registerPlayerScores( dartPlayScores );

		// Setup the play panel
		dartBoard = new DartBoardFrame( dartPlayScores, dartTable.getModel() );
		dartBoard.setSize( 700, 700 );
		//dartBoard.registerScoreBoard((AbstractTableModel) dartTable.getModel());

		JScrollPane bottomPane = new JScrollPane(dartTable);
		splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, null, bottomPane);
		
		// To make the splitPane resize when the window does, we must use
		// a layout manager that supports it.
		setLayout( new BorderLayout() );
		add( splitPane, BorderLayout.CENTER );

		threePaneMode();
		}

	public void threePaneMode()
		{
		// Put the three panes in the one big frame pane.
		JScrollPane leftPane = new JScrollPane(dartTree);
		dartTree.treeDidChange();
		dartControlPanel.allowSave(DartDBNode.getDirty());
		JSplitPane topPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPane,
				dartControlPanel);
		topPane.setDividerLocation( 440 );

		//dartBoard.setVisible( false );
		
		splitPane.setLeftComponent(topPane);
		splitPane.setDividerLocation( 300 );
		}

	public void playMode( DartDBNode game )
		{
		// Put the three panes in the one big frame pane.
		dartBoard.play( game );
		dartBoard.setVisible( true );
		splitPane.setLeftComponent( dartPlayScores );
		splitPane.setDividerLocation( 300 );
		}

	public void saveDartDB()
		{
		dartDB.saveToFile(DATA_FILENAME);
		dartControlPanel.allowSave(DartDBNode.getDirty());
		}
	
	public void setDetailMode( boolean detailedDisplay )
		{
	  ((DartTableModel) dartTable.getModel()).setDetailMode( detailedDisplay );
		}

	/**
	 * createAndShowGUI
	 */
	private static void createAndShowGUI()
		{
		JFrame frame = new JFrame("Darts");
		frame.setDefaultCloseOperation( JFrame.DO_NOTHING_ON_CLOSE );

		// Create an object of this class and make it the content pane.
		Darts dartPane = new Darts();
		frame.addWindowListener( dartPane );
		dartPane.setOpaque(true);
		frame.setContentPane(dartPane);
		frame.setSize( 900, 560 );
		frame.setVisible(true);
		}

	/**
	 * Main - Schedule a job for the event-dispatching thread:
	 * create and display the GUI
	 * @param args
	 */
	public static void main(String[] args)
		{
		SwingUtilities.invokeLater(new Runnable()
			{
				public void run()
					{
					createAndShowGUI();
					}
			});
		}

	public void windowOpened(WindowEvent arg0)
		{
		// TODO Auto-generated method stub
		
		}

	public void windowClosing(WindowEvent e) 
		{
		if( DartDBNode.getDirty() )
			{
			int selection = JOptionPane.showConfirmDialog(null,
	              "There are unsaved changes. Save before quiting?", "Save?",
	              JOptionPane.YES_NO_CANCEL_OPTION,
	              JOptionPane.WARNING_MESSAGE);
			
			if( selection != JOptionPane.CANCEL_OPTION )
				{
				if( selection == JOptionPane.YES_OPTION ) 
					saveDartDB();
	      System.exit( 0 );
				}
			}
		else
		  System.exit( 0 );
		}   
	
	public void windowClosed(WindowEvent arg0)
		{
		// TODO Auto-generated method stub
		System.exit( 0 );
		}

	public void windowIconified(WindowEvent arg0)
		{
		// TODO Auto-generated method stub
		
		}

	public void windowDeiconified(WindowEvent arg0)
		{
		// TODO Auto-generated method stub
		
		}

	public void windowActivated(WindowEvent arg0)
		{
		// TODO Auto-generated method stub
		
		}

	public void windowDeactivated(WindowEvent arg0)
		{
		// TODO Auto-generated method stub
		
		}
	
	}
