///////////////////////////////////////////////////////////////////////////

//

// Pro24301  Write a program that simulates the Jeopardy contestant

//      push buttons.  This program is to have three player

//      views and one Alex view.  The players views must keep the 

//      name of the player local as an identification mechanism.

//      The players view will have one button and the name of the 

//      player.  The Alex view will be one text area to display the

//      winner, for that question, and a reset button.

//

//      The model is to contain a String name instance variable and 

//      a boolean buzzed instance variable.  The name holds the name

//      of the player the pressed the buzzer and the boolean variable

//      holds the buzzer state.  Alex's view resets the buzzed to 

//      false.  The first players buzzers sets the buzzed variable

//      to true and places there name as the winnning buzzard.

//                                                                         

//

//      +--------------+   +--------------+   +--------------+

//          |        _ = X |   |        _ = X |   |        _ = X |

//      +--------------+   +--------------+   +--------------+

//          |              |   |              |   |              |

//          |  Player One  |   | Player Two   |   | Player Three |

//          |              |   |              |   |              |

//          |  +--------+  |   |  +--------+  |   |  +--------+  |

//          |  | Buzzer |  |   |  | Buzzer |  |   |  | Buzzer |  |

//          |  +--------+  |   |  +--------+  |   |  +--------+  |

//      +--------------+   +--------------+   +--------------+

//

//

//                  +-------------------+

//                  |             _ = X |

//                  +-------------------+

//                  |                   |

//                  |  Alex             |

//                  | +---------------+ |

//                  | | Player three  | |

//                  | |               | |

//                  | +---------------+ |

//                  |                   |

//                  |    +---------+    |

//                  |    |  Reset  |    |

//                  |    +---------+    |

//                  +-------------------+

//

//

//

//

///////////////////////////////////////////////////////////////////////////

//

//

//        

//

//





package Buzzer;



import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import java.util.*;



public class Pro24301 {

  public static void main(String[] args) {    

    new Controller();    

}}







class Controller extends JPanel  

{

  GUIView  viewA;

  GUIView  viewB;

  GUIView  viewC;

  GUIViewB alex;



  Model model;





  public Controller()

  {

    viewA  = new GUIView("Player One");

    viewB  = new GUIView("Player Two");

    viewC  = new GUIView("Player Three");

    alex = new GUIViewB();



    model = new Model();  

    model.addObserver( viewA );  

    model.addObserver( viewB );

    model.addObserver( viewC );

    model.addObserver( alex );  



    viewA.setController(new ButtonController1());

    viewB.setController(new ButtonController2());

    viewC.setController(new ButtonController3());

    alex.setController(new ResetController());



  }



  class ButtonController1 implements ActionListener

  {

    public void actionPerformed(ActionEvent event)

    {



      if(model.buzzed == false)

        model.buzz(viewA.theName);

      model.sendNotification();  

    }

  }



  class ButtonController2 implements ActionListener

  {

    public void actionPerformed(ActionEvent event)

    {



      if(model.buzzed == false)

        model.buzz(viewB.theName);

      model.sendNotification();  

    }

  }



  class ButtonController3 implements ActionListener

  {

    public void actionPerformed(ActionEvent event)

    {



      if(model.buzzed == false)

        model.buzz(viewC.theName);

      model.sendNotification();  

    }

  }



  class ResetController implements ActionListener

  {

    public void actionPerformed(ActionEvent event)

    {

      model.reset();  

      model.sendNotification();  

    }

  }

}



class  GUIView  extends JFrame implements Observer 

{ 

  private JButton buzz;

  private JLabel name;

  protected String theName;



  public GUIView(String name)

  {

    setSize(200,100);



    theName = name;



    setLayout( new FlowLayout() );

    {

      this.name = new JLabel( name );

      add( this.name );



      buzz = new JButton("Buzz In");

      add( buzz );

    }



    setLocation(new Random().nextInt(300)+100,

          new Random().nextInt(300)+100);

      setDefaultCloseOperation(EXIT_ON_CLOSE);

      setFocusable(true);

    setVisible(true);

  }



  public String getName()

  {

    return theName;

  }



  public void update(Observable obs, Object x){}



  public void setController(ActionListener listener)

  {

    buzz.addActionListener(listener);

  }

}



class  GUIViewB  extends JFrame implements Observer 

{ 

  private JButton reset;

  private JLabel name;

  private JTextField field;



  public GUIViewB()

  {

    setSize(200,100);



    setLayout( new FlowLayout() );

    {

      this.name = new JLabel( "Alex");

      add( name );



      field = new JTextField(10);

      add( field );



      reset = new JButton("Reset");

      add( reset );

    }



    setLocation(new Random().nextInt(300)+100,

          new Random().nextInt(300)+100);

      setDefaultCloseOperation(EXIT_ON_CLOSE);

      setFocusable(true);

    setVisible(true);

  }



  public void update(Observable obs, Object x)

  {

    field.setText(((Model)obs).name);  

  }



  public void setController(ActionListener listener)

  {

    reset.addActionListener(listener);

  }

}



class Model extends Observable

{

  protected boolean buzzed;

  protected String name;



  public void reset() 

  { 

    buzzed = false; 

    name = "";

  }



  public void buzz(String aName)

  { 

    buzzed = true;

    name = aName;

  }



  public void sendNotification()

  {

    setChanged();

    notifyObservers();

  }

}