/* * @(#)DistributionChooser.java 0.0.1 99/08/06 * * Copyright (c) 1999 by Willie Wheeler. All rights reserved. */ package causation.lab; import java.util.*; import javax.swing.*; import stats.*; /** * A JComponent to allow the user to specify a distribution. In * particular, the chooser is designed to provide the user with an easy way * to specify Chart constructor parameters. *

* The DistributionChooser allows the user to set three types of * information: *

* In fact there are two types of DistributionChooser. The first type * allows the user to specify a single conditioning state, and hence a single * distribution. The second type allows the user to specify multiple * conditioning states, and hence multiple distributions, by allowing him or * her to choose a set of conditioning variables. The associated set of states * is defined to be the set of all conditioning states such that all selected * conditioning variables have specific values. A chooser's type is specified * in the constructor with the constants CONDITIONING_STATE (first * type) and CONDITIONING_VARIABLES (second type). *

* In the sample code that follows, we show how to build a chooser that allows * the user to pick multiple distributions. We place it inside of a * JOptionPane, and then generate a BarChart for each of * the distributions. *

 *      // Build a chooser and put it in an option pane.
 *      ContingencyTableModel model = tabulator.getDataOut();
 *      DistributionChooser chooser = new DistributionChooser(
 *              model, DistributionChooser.CONDITIONING_VARIABLES);
 *      int option = JOptionPane.showInternalOptionDialog(
 *              desktopPane, chooser, "Distribution Chooser",
 *              JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE,
 *              null, null, null);
 *
 *      // Store the user-provided distribution specification.
 *      int[] independents = chooser.getSelectedIndependents();
 *      int dependent = chooser.getSelectedDependent();
 *      int[][] conditioningStates = chooser.getSelectedConditioningStates();
 *
 *      // Return if the user cancels.  S/he can do this either by pressing
 *      // 'Cancel' explicitly, or by pressing 'Ok' but not selecting any
 *      // independent variables.
 *      if (option == JOptionPane.CANCEL_OPTION || independents.length == 0) {
 *              return;
 *      }
 *
 *      // User hasn't cancelled, so let's build the charts.
 *      Vector charts = new Vector();
 *      for (int i = 0; i < conditioningStates.length; i++) {
 *              charts.add(new BarChart(model, independents, dependent,
 *                      conditioningStates[i]));
 *      }
 * 
* Supposing that the model's independent variables are Sex, * Hair Color, and Smoker?, the above code produces the * following distribution chooser: *

* * * @version 0.0.1 08/06/99 * @author Willie Wheeler * @see Chart */ public class DistributionChooser extends JComponent { // Chooser types. /** * Chooser type associated with choosers that allow the user to specify * a single conditioning state, and hence a single distribution. */ public static final int CONDITIONING_STATE = 0; /** * Chooser type associated with choosers that allow the user to specify * multiple conditioning states, and hence multiple distributions. This * type is called 'conditioning variables' because the multiple states * are generated from a user-specifiable set of conditioning variables * by considering all conditioning states in which the conditioning * variables have specific values. */ public static final int CONDITIONING_VARIABLES = 1; protected ContingencyTableModel model; protected int type; protected int[] selIndepVarIndices; protected int selDepVarIndex; protected int[] selCondVarIndices; protected int[][] selCondStates; public DistributionChooser(ContingencyTableModel model, int type) { this.model = model; this.type = type; updateUI(); } public void updateUI() { setUI(UIManager.getUI(this)); } public String getUIClassID() { return "causation.lab.plaf.DistributionChooserUI"; } public ContingencyTableModel getModel() { return model; } public int getNumIndependents() { return getIndependents().size(); } public Vector getIndependents() { return model.getIndependents(); } public int getNumDependents() { return getDependents().size(); } public Vector getDependents() { return model.getDependents(); } public int getType() { return type; } public void setSelectedIndependents(int[] indices) { this.selIndepVarIndices = indices; } public int[] getSelectedIndependents() { return selIndepVarIndices; } public void setSelectedDependent(int index) { this.selDepVarIndex = index; } public int getSelectedDependent() { // Had to do this to meet Richard's CDistributionChooserUI specs... // return selDepVarIndex; return 0; } public void setSelectedConditioningVariables(int[] indices) { this.selCondVarIndices = indices; } public int[] getSelectedConditioningVariables() { return selCondVarIndices; } public void setSelectedConditioningStates(int[][] states) { this.selCondStates = states; } public int[][] getSelectedConditioningStates() { return selCondStates; } }