package Darts;

import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JPanel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.TreePath;

public class DartControlPanel extends JPanel 
					   implements TreeSelectionListener, ActionListener  {
	//
	// Constants
	//
	private static final long serialVersionUID = 1L;
	private static String ADD_BUTTON_PUSHED = "Add";
	private static String PLAY_BUTTON_PUSHED = "Play";
	private static String REMOVE_BUTTON_PUSHED = "Remove";
	private static String SAVE_BUTTON_PUSHED = "Save";
	
	//
	// Member Data
	//
	DartTree dartTree;
	Darts  	 mainObj;    // For callbacks (playMode and Save)
	JButton  addButton;
	JButton  playButton;
	JButton  removeButton;
	JButton  saveButton;
	JCheckBox detailedDisplay;
	//
	// Methods
	//
	/**
	 * Constructor:
	 *   Setup the control panel.
	 */
	public DartControlPanel( Darts  theMainObj, DartTree  theDartTree ) {
		super( new GridBagLayout() );
			
		dartTree = theDartTree;
		mainObj = theMainObj;
		GridBagConstraints  c = new GridBagConstraints();
		
		addButton = new JButton( "Add" );
		addButton.setEnabled( false );
		addButton.setActionCommand( ADD_BUTTON_PUSHED );
		addButton.addActionListener( this );
		
		playButton = new JButton( "Play" );
		playButton.setEnabled( false );
		playButton.setActionCommand( PLAY_BUTTON_PUSHED );
		playButton.addActionListener( this );
	
		removeButton = new JButton( "Remove" );
		removeButton.setEnabled( false );
		removeButton.setActionCommand( REMOVE_BUTTON_PUSHED );
		removeButton.addActionListener( this );
	
		saveButton = new JButton( "Save" );
		saveButton.setEnabled( false );
		saveButton.setActionCommand( SAVE_BUTTON_PUSHED );
		saveButton.addActionListener( this );
		
		detailedDisplay = new JCheckBox( "Detailed display" );
		detailedDisplay.addChangeListener( new ChangeListener() 
			{ public void stateChanged( ChangeEvent e )
				{ mainObj.setDetailMode( detailedDisplay.isSelected() ); }} );
		
		//c.anchor = GridBagConstraints.CENTER
		c.fill = GridBagConstraints.BOTH;
		c.gridwidth = GridBagConstraints.REMAINDER; //end row

		add( addButton, c );
		add( playButton, c );
		add( removeButton, c );
		add( saveButton, c );
		add( detailedDisplay, c );
	}
	
	//
	// Methods to implement the "ActionListener" interface.
	// Listening for button pushes.
	//
	/**
	 * actionPerformed: Handle button pushes
	 */
	public void actionPerformed( ActionEvent event ) {
		
		if( event.getActionCommand() == SAVE_BUTTON_PUSHED ) {
			//
			// "Save" Button Push
			//
			mainObj.saveDartDB();
			return; // <---------------- RETURN
		}
		
		// The following control depend of tree selectionGet the selected item in the tree (if any)
		TreePath    path = dartTree.getSelectionModel().getSelectionPath();
		DartDBNode  selectedNode = null;
		if( path != null )
			selectedNode = (DartDBNode)path.getLastPathComponent();
		
		if( selectedNode != null ) {
			if( event.getActionCommand() == ADD_BUTTON_PUSHED ) {
				//
				// "Add" Button Push
				//
				// Create a new node and add it under the selected node.
				DartDBNode  newDBNode = new DartDBNode( selectedNode );
				
				if( newDBNode.getNodeType() == DartDBNode.GAME_NODE ) {
					// Add Players.  Use same names as last Game, but make first play last.
					DartDBNode  prevGame = (DartDBNode) selectedNode.getChildBefore( newDBNode );
					if( prevGame != null ) {
						int  numOfPlayers = prevGame.getChildCount();
						for( int i = 0; i < numOfPlayers; i++ ) {
							// Create a new players and change the name.
							DartDBNode  newPlayer = new DartDBNode( newDBNode );
							newPlayer.setName( ((DartDBNode)prevGame.getChildAt((i+1)%numOfPlayers)).toString() );
						}
					}
				}

				// Update everyone
				saveButton.setEnabled( DartDBNode.getDirty() );
				((DartTreeModel)dartTree.getModel()).DBNodeWasInsered( newDBNode );
				//dartTree.expandPath( path );
				//dartTree.setSelectionPath( path );

			} else if( event.getActionCommand() == PLAY_BUTTON_PUSHED ) {
				//
				// "Play" Button Push
				//
				mainObj.playMode( selectedNode );
			} else if( event.getActionCommand() == REMOVE_BUTTON_PUSHED ) {
				//
				// "Remove" Button Push
				//
				DartDBNode  parent = (DartDBNode)selectedNode.getParent();
				if( parent != null ) {
					((DartTreeModel)dartTree.getModel()).DBNodeWillBeRemoved(selectedNode);
					parent.remove( selectedNode );
					
					// Update everyone
					saveButton.setEnabled( DartDBNode.getDirty() );
					dartTree.expandPath( path );
					dartTree.setSelectionPath( path );
				}
			}
		}
	}
	
	public void allowSave( boolean saveAllowed ) {
		saveButton.setEnabled( saveAllowed );
	}
	
	//
	// Methods to implement the "TreeSelectionListener" interface.
	// Listening for Tree View selections.
	//
	public void valueChanged( TreeSelectionEvent event ) {
		if( event.getPath() == null  ||  event.getPath().getPathCount() == 0 ) {
			addButton.setEnabled(    false );
			removeButton.setEnabled( false );
			playButton.setEnabled(   false );
		} else if( event.getPath().getPathCount() == DartDBNode.ROOT_NODE ) {
			addButton.setEnabled(    true );
			removeButton.setEnabled( false );
			playButton.setEnabled(   false );
		} else if( event.getPath().getPathCount() == DartDBNode.GAME_NODE ) {
			addButton.setEnabled(    true );
			removeButton.setEnabled( true );
			playButton.setEnabled(   true );
		} else {
			addButton.setEnabled(    true );
			removeButton.setEnabled( true );
			playButton.setEnabled(   false );
		}
	}

	
}
