package jas.hist;
import jas.util.JASDialog;
import jas.util.JASState;
import jas.util.SciFormatPanel;
import jas.util.ScientificFormat;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.text.Format;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.ListCellRenderer;
import javax.swing.ListModel;
/**This class creates a gui popup window for choosing which statistics and titles should be displayed
*in the StatisticsBlock, and for setting the number formatting parameters for
* base.jas.util.ScientificFormat. The window uses the jpane created by base.jas.util.SciFormatPanel
* for setting the ScientificForm parameters. This window created by selecting "Stats Properties.."
* from the popup menu. If generated, the number formatting method in Statistics Block is
* set to ScientificFormat.
* @author Paul Spence
* @version 03/20/2000
* "userInterface.propertiesDialog.Statistics"
* */
public class StatsWindow extends JASDialog implements ActionListener
{
public static JFrame frame;
private JButton all;
private JButton none;
private JRadioButton alltitles;
private JRadioButton notitles;
private JRadioButton sometitles;
private JRadioButton leftalign;
private JRadioButton rightalign;
private JRadioButton noalign;
private JRadioButton alwaysall;
private JRadioButton subset;
private String[] names;
private JLabel selectlabel;
private SciFormatPanel scipanel;
private ScientificFormat f;
private StatisticsBlock statblock;
private JList list;
private int showtitles;
private int splitalign;
public StatsWindow(StatisticsBlock b)
{
super(frame, "Statistic Display Options", true, JASDialog.OK_BUTTON | JASDialog.CANCEL_BUTTON | JASDialog.APPLY_BUTTON | JASDialog.HELP_BUTTON);
statblock = b;
Format sf = b.getFormat();
if (sf instanceof ScientificFormat) f = (ScientificFormat) sf;
else f = new ScientificFormat();
}
/**
* This method will create and show the Statistics Window
*/
public void showStatsWindow()
{
super.setHelpTopic("userInterface.Statistics");
Container c = getContentPane();
c.removeAll();
scipanel = new SciFormatPanel(f);
//always all or subset buttoons
ButtonGroup allways_subset_group = new ButtonGroup();
alwaysall = new JRadioButton("Always show all statistics");
alwaysall.addActionListener(this);
alwaysall.setActionCommand("alwaysall");
subset = new JRadioButton("Show selection of current statistics");
subset.addActionListener(this);
subset.setActionCommand("subset");
allways_subset_group.add(alwaysall);
allways_subset_group.add(subset);
Box allways_subset_box = new Box(BoxLayout.X_AXIS);
allways_subset_box.add(alwaysall);
allways_subset_box.add(subset);
//checkbox list
names = statblock.getStatNames();
list = new JList( createData(names) );
list.setVisibleRowCount(3);
list.setCellRenderer(new CheckListRenderer());
list.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
int index = list.locationToIndex(e.getPoint());
if(index != -1 && list.getModel().getSize() >index){
CheckableItem item = (CheckableItem)list.getModel().getElementAt(index);
item.setSelected(! item.isSelected());
Rectangle rect = list.getCellBounds(index, index);
list.repaint(rect);
}
}
});
JScrollPane checkbuttonspanel = new JScrollPane(list);
Box subsetbuttons = new Box(BoxLayout.Y_AXIS);
all = new JButton("All");
none = new JButton("None");
all.setActionCommand("all");
all.addActionListener(this);
none.setActionCommand("none");
none.addActionListener(this);
subsetbuttons.add(all);
subsetbuttons.add(none);
JPanel statselection = new JPanel();
statselection.setLayout(new BorderLayout());
selectlabel = new JLabel("Choose selection of current statistics for display");
statselection.add(selectlabel,BorderLayout.NORTH);
statselection.add(subsetbuttons,BorderLayout.EAST);
statselection.add(checkbuttonspanel, BorderLayout.CENTER);
Box statoptionsbox = new Box(BoxLayout.Y_AXIS);
statoptionsbox.add(allways_subset_box);
statoptionsbox.add(statselection);
JPanel statoptions = new JPanel();
statoptions.setBorder(BorderFactory.createTitledBorder("Choose a statistics display options"));
statoptions.add(statoptionsbox);
//display title and alignment
showtitles = statblock.getShowTitles();
alltitles = new JRadioButton("Always show title");
notitles = new JRadioButton("Never show title");
sometitles = new JRadioButton("Show if multiple plots");
alltitles.setActionCommand("alltitles");
alltitles.addActionListener(this);
notitles.setActionCommand("notitles");
notitles.addActionListener(this);
sometitles.setActionCommand("sometitles");
sometitles.addActionListener(this);
Box titlebox = new Box(BoxLayout.X_AXIS);
titlebox.add(alltitles);
titlebox.add(notitles);
titlebox.add(sometitles);
ButtonGroup titlegroup = new ButtonGroup();
titlegroup.add(alltitles);
titlegroup.add(notitles);
titlegroup.add(sometitles);
if(showtitles == statblock.SHOWTITLES_ALWAYS) alltitles.setSelected(true);
else if(showtitles == statblock.SHOWTITLES_NEVER) notitles.setSelected(true);
else if(showtitles == statblock.SHOWTITLES_AUTOMATIC) sometitles.setSelected(true);
JPanel titleoptions = new JPanel();
titleoptions.setBorder(BorderFactory.createTitledBorder("Select a title display option for plots with statistics"));
titleoptions.add(titlebox);
splitalign = statblock.getSplitStringAlign();
leftalign = new JRadioButton("Left align numbers");
rightalign = new JRadioButton("Right align numbers");
noalign = new JRadioButton("Do not align numbers");
leftalign.setActionCommand("leftalign");
leftalign.addActionListener(this);
rightalign.setActionCommand("rightalign");
rightalign.addActionListener(this);
noalign.setActionCommand("noalign");
noalign.addActionListener(this);
ButtonGroup aligngroup = new ButtonGroup();
Box alignbox = new Box(BoxLayout.X_AXIS);
aligngroup.add(leftalign);
aligngroup.add(rightalign);
aligngroup.add(noalign);
alignbox.add(leftalign);
alignbox.add(rightalign);
alignbox.add(noalign);
JPanel alignoptions = new JPanel();
alignoptions.setBorder(BorderFactory.createTitledBorder("Select an alignment display option for the statistics values"));
alignoptions.add(alignbox);
if(splitalign == statblock.LEFTALIGNSPLIT) leftalign.setSelected(true);
else if(splitalign == statblock.RIGHTALIGNSPLIT) rightalign.setSelected(true);
else if(splitalign == statblock.NOALIGNSPLIT) noalign.setSelected(true);
JPanel scioptions = scipanel.getPanel();
scioptions.setBorder(BorderFactory.createTitledBorder("Set number formating parameters for numerical statistics"));
if(statblock.get_AllwaysAll_Subset()){
alwaysall.setSelected(true);
this.enableStatSelections(false);
}else subset.setSelected(true);
Box box = new Box(BoxLayout.Y_AXIS);
box.add(statoptions);
box.add(titleoptions);
box.add(alignoptions);
box.add(scioptions);
c.add(box);
pack();
show();
}
public void onOK(){
String[] s;
scipanel.updateSciFormat();//sets max width, sig digits and style for doubles
ListModel model = list.getModel();
if(alwaysall.isSelected()){
statblock.setSelectedEntries(s = null);
statblock.set_AllwaysAll_Subset(true);
}else if(model.getSize()>0){
int n = model.getSize();
int j = 0;
for(int i=0;i<n;i++){
CheckableItem item = (CheckableItem)model.getElementAt(i);
if(item.isSelected()){
j++;
}
}
if( j>0 ){
s = new String[j];
int k = 0;
for(int i=0;i<n;i++){
CheckableItem item = (CheckableItem)model.getElementAt(i);
if(item.isSelected()){
s[k] = item.toString();
k++;
}
}
}else{
s = new String[1];
s[0] = "\none";
}
statblock.setSelectedEntries(s);
statblock.set_AllwaysAll_Subset(false);
}else{
statblock.setSelectedEntries(s=null);
statblock.set_AllwaysAll_Subset(false);
}
statblock.setShowTitles(showtitles);
statblock.setSplitStringAlign(splitalign);
statblock.setFormat(f);
dispose();
}
protected void enableApply(JASState state)
{
state.setEnabled(true);
}
protected void enableHelp(JASState state)
{
state.setEnabled(true);
}
public void onCancel(){
dispose();
}
public void onApply(){
scipanel.updateSciFormat();//sets max width, sig digits and style for doubles
String[] s;
ListModel model = list.getModel();
if(alwaysall.isSelected()){
statblock.setSelectedEntries(s = null);
statblock.set_AllwaysAll_Subset(true);
}else if(model.getSize()>0){
int n = model.getSize();
int j = 0;
for(int i=0;i<n;i++){
CheckableItem item = (CheckableItem)model.getElementAt(i);
if(item.isSelected()){
j++;
}
}
if( j>0 ){
s = new String[j];
int k = 0;
for(int i=0;i<n;i++){
CheckableItem item = (CheckableItem)model.getElementAt(i);
if(item.isSelected()){
s[k] = item.toString();
k++;
}
}
}else{
s = new String[1];
s[0] = "\none";
}
statblock.setSelectedEntries(s);
statblock.set_AllwaysAll_Subset(false);
}else{
statblock.setSelectedEntries(s=null);
statblock.set_AllwaysAll_Subset(false);
}
statblock.setShowTitles(showtitles);
statblock.setSplitStringAlign(splitalign);
statblock.setFormat(f);
}
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand() == "all" ){
ListModel model = list.getModel();
int n = model.getSize();
for (int i=0;i<n;i++) {
CheckableItem item = (CheckableItem)model.getElementAt(i);
item.setSelected(true);
}
list.repaint();
}else if(e.getActionCommand() == "none"){
ListModel model = list.getModel();
int n = model.getSize();
for (int i=0;i<n;i++) {
CheckableItem item = (CheckableItem)model.getElementAt(i);
item.setSelected(false);
}
list.repaint();
}else if(e.getActionCommand() == "alwaysall"){
enableStatSelections(false);
}else if(e.getActionCommand() == "subset"){
enableStatSelections(true);
}else if(e.getActionCommand()=="alltitles"){
showtitles = statblock.SHOWTITLES_ALWAYS;
}else if(e.getActionCommand()=="notitles"){
showtitles = statblock.SHOWTITLES_NEVER;
}else if(e.getActionCommand()=="sometitles"){
showtitles = statblock.SHOWTITLES_AUTOMATIC;
}else if(e.getActionCommand()=="leftalign"){
splitalign = statblock.LEFTALIGNSPLIT;
}else if(e.getActionCommand()=="rightalign"){
splitalign = statblock.RIGHTALIGNSPLIT;
}else if(e.getActionCommand()=="noalign"){
splitalign = statblock.NOALIGNSPLIT;
}
}
private void enableStatSelections(boolean toggleable){
all.setEnabled(toggleable);
none.setEnabled(toggleable);
selectlabel.setEnabled(toggleable);
list.setEnabled(toggleable);
}
private CheckableItem[] createData(String[] strs) {
int n = strs.length;
CheckableItem[] items = new CheckableItem[n];
for (int i=0;i<n;i++) {
items[i] = new CheckableItem(strs[i]);
}
return items;
}
class CheckableItem {
private String str;
private boolean isSelected;
public CheckableItem(String str) {
this.str = str;
isSelected = false;
initializeSelection();
}
private void initializeSelection(){
String[] oldselections = statblock.getSelectedEntries();
if(oldselections==null) setSelected(true);
if(oldselections!=null)
for (int i=0;i<oldselections.length;i++)
if(str.equals(oldselections[i])) setSelected(true);
}
public void setSelected(boolean b) {
isSelected = b;
}
public boolean isSelected() {
return isSelected;
}
public String toString() {
return str;
}
}
class CheckListRenderer extends JCheckBox implements ListCellRenderer {
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean hasFocus) {
setEnabled(list.isEnabled());
setSelected(((CheckableItem)value).isSelected());
setText(value.toString());
setBackground(Color.white);
return this;
}
}
}