package context.arch.service; import java.awt.Checkbox; import java.awt.Button; import java.awt.Label; import java.awt.Frame; import java.awt.Panel; import java.awt.CheckboxGroup; import java.awt.BorderLayout; import java.awt.GridBagLayout; import java.awt.GridBagConstraints; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.util.Vector; /** * This class is a frame that runs in it's own thread. It's able to display * a title, question to the user, choices to the user in the form of radio * buttons, and to make the user choice available, if any. */ public class DisplayChoiceFrame extends Frame implements Runnable, ActionListener { private static final long serialVersionUID = -6038071883157249221L; /** * Tag for the submit button */ public static final String SUBMIT = "submit"; /** * Tag for the cancel button */ public static final String CANCEL = "cancel"; /** * Tag if the user does not select any choice */ public static final String NO_CHOICE = "noChoice"; private ActionListener listener; private String requestId; private CheckboxGroup cbg; private String choice; private Button submit, cancel; /** * This constructor lays out and creates the frame for the user to view. * * @param listener ActionListener object to pass events to * @param choices List of choices to display to the user * @param question Question to pose to the user * @param requestId Unique id to identify the result */ public DisplayChoiceFrame(ActionListener listener, Vector<String> choices, String question, String requestId) { this.listener = listener; this.requestId = requestId; setLayout(new BorderLayout()); GridBagLayout gridbag = new GridBagLayout(); GridBagConstraints c = new GridBagConstraints(); Panel p1 = new Panel(); p1.setLayout(gridbag); c.fill = GridBagConstraints.BOTH; c.weightx = 1.0; Label lQuestion = new Label(question); c.gridwidth = GridBagConstraints.REMAINDER; gridbag.setConstraints(lQuestion,c); p1.add(lQuestion); cbg = new CheckboxGroup(); for (int i = 0; i < choices.size(); i++) { Checkbox cb = new Checkbox(choices.elementAt(i), false, cbg); c.gridwidth = GridBagConstraints.REMAINDER; gridbag.setConstraints(cb,c); p1.add(cb); if (i == 0) { cbg.setSelectedCheckbox(cb); } } add("North",p1); Panel p2 = new Panel(); p2.setLayout(gridbag); c.fill = GridBagConstraints.BOTH; c.weightx = 1.0; c.gridwidth = GridBagConstraints.RELATIVE; submit = new Button("Submit"); submit.addActionListener(this); submit.setActionCommand(SUBMIT); gridbag.setConstraints(submit,c); p2.add(submit); c.gridwidth = GridBagConstraints.REMAINDER; cancel = new Button("Cancel"); cancel.addActionListener(this); cancel.setActionCommand(CANCEL); gridbag.setConstraints(cancel,c); p2.add(cancel); add("South",p2); } /** * This method implements the necessary method for the ActionListener interface. * If a user clicks on either button, it collects this information and notifies * the listener passed into this class with an ActionEvent containing the * object that created the event (submit or cancel button), and the unique * id passed into this class. * * @see ActionEvent */ public void actionPerformed(ActionEvent evt) { Object obj; if (evt.getActionCommand().equals(SUBMIT)) { choice = cbg.getSelectedCheckbox().getLabel(); obj = submit; } else { choice = NO_CHOICE; obj = cancel; } listener.actionPerformed(new ActionEvent(obj,0,requestId)); } /** * This method implements the necessary method for the Runnable interface. * It simply makes the frame visible to the user. * * #setVisible(boolean); */ public void run() { setVisible(true); } /** * This method returns the user's choice from the radio buttons. This * will be one of the input choices, or, if none selected, it will be * NO_CHOICE. * * @return the user's choice * @see #NO_CHOICE */ public String getChoice() { return choice; } }