// Class ObstCourseWindow
//
// Author: Alyce Brady
//    1 December 2002
//    Modified 21 May 2017 to add @Override
//
// This class is based on the College Board's MBSGUIFrame class,
// as allowed by the GNU General Public License.  MBSGUIFrame
// is a black-box class within the AP(r) CS Marine Biology Simulation
// case study (see www.collegeboard.com/ap/students/compsci).
//
// License Information:
//   This class is free software; you can redistribute it and/or modify
//   it under the terms of the GNU General Public License as published by
//   the Free Software Foundation.
//
//   This class is distributed in the hope that it will be useful,
//   but WITHOUT ANY WARRANTY; without even the implied warranty of
//   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//   GNU General Public License for more details.

import edu.kzoo.grid.Grid;
import edu.kzoo.grid.gui.ActiveGridAppController;
import edu.kzoo.grid.gui.ControlButton;
import edu.kzoo.grid.gui.EnabledDisabledStates;
import edu.kzoo.grid.gui.GridDataFileHandler;
import edu.kzoo.grid.gui.SteppedGridAppController;
import edu.kzoo.grid.gui.SteppedGridAppFrame;
import edu.kzoo.grid.gui.nuggets.BasicGridFileMenu;

/**
 *  Obstacle Course Program:<br>
 *
 *  An <code>ObstCourseWindow</code> is a window containing the graphical
 *  display of a grid with a slider, and a menu that allows the
 *  user to edit the grid.
 *
 *  @author Alyce Brady
 *  @version 21 May 2017
 **/
public class ObstCourseWindow extends SteppedGridAppFrame
{
    private static final boolean REDISPLAY = true;

    private ObstCourseFileMenuActionHandler menuActionHandler;

  // constructors and initialization methods

    /** Creates a window in which to run an obstacle race.
     **/
    public ObstCourseWindow()
    {
        // This is an active grid frame with Step, N Steps,
        // Run and Stop buttons, but not a Restart button.
        super(new ActiveGridAppController(), REDISPLAY);
        SteppedGridAppController controller = getController();

        GridDataFileHandler fileHandler = new ObstCourseDataFileHandler();
        menuActionHandler = new ObstCourseFileMenuActionHandler(this,
                                                                fileHandler);
        includeMenu(new BasicGridFileMenu(this, menuActionHandler,
                                          fileHandler));
        includeControlComponent(
              new ControlButton(this, "New Grid", REDISPLAY)
                  { public void act() 
                    {   menuActionHandler.createNewGrid();
                    }},
              EnabledDisabledStates.NEEDS_APP_WAITING);
        includeControlComponent(
              new ControlButton(this, "Add Racers", REDISPLAY)
                  { public void act() { invokeEditor(); }},
              EnabledDisabledStates.NEEDS_GRID_AND_APP_WAITING);
        includeStepOnceButton();
        includeStepNTimesButton();
        includeRunButton();
        includeStopButton(REDISPLAY);
        includeSpeedSlider();

        constructWindowContents("Obstacle Race", null, 0, 0, 0);

        // Tool tips should show object info, not just location.
        getDisplay().makeToolTipsReportObject();
    }


  // redefined methods from GridAppFrame

    /** Sets the Grid being displayed.
     *  (Precondition: grid is not null.)
     *    @param grid the Grid to display
     **/
    @Override
    public void setGrid(Grid grid)
    {
        super.setGrid(grid);
        showGrid();
    }


  // methods that implement button actions

    /** Invokes the obstacle course editor for placing racers.
     *    
     */
    protected void invokeEditor()
    {
        new ObstCourseEditor(this);
    }

    /** Advances the application one step. 
     **/
    @Override
    public void step()
    {
        super.step();
        showGrid();
    }

}


