/* * Copyright (c) 2012 Patrick Meyer * * This program 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, either version 3 of the License, or * (at your option) any later version. * * This program 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. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.itemanalysis.jmetrik.stats.scaling; import javax.swing.*; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; import java.util.HashMap; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import com.itemanalysis.jmetrik.selector.MultipleSelectionPanel; import com.itemanalysis.jmetrik.sql.DataTableName; import com.itemanalysis.jmetrik.sql.DatabaseName; import com.itemanalysis.jmetrik.workspace.VariableChangeListener; import com.itemanalysis.psychometrics.data.ItemType; import com.itemanalysis.psychometrics.data.VariableAttributes; import com.itemanalysis.psychometrics.data.VariableName; import org.apache.log4j.Logger; public class TestScalingDialog extends JDialog{ // Variables declaration - do not modify private JPanel constraintPanel; private JLabel meanLabel; private JTextField meanTextField; private JComboBox scoreNameComboBox; private JLabel maxLabel; private JTextField maxTextField; private JLabel minLabel; private JTextField minTextField; private JLabel nameLabel; private JTextField nameTextField; private JLabel precisionLabel; private JTextField precisionTextField; private JPanel scorePanel; private JLabel stdDevLabel; private JTextField stdDevTextField; private JPanel transformationPanel; private JLabel typeLabel; // End of variables declaration private boolean canRun = false; private TestScalingCommand command = null; private MultipleSelectionPanel vsp = null; private DatabaseName dbName = null; private DataTableName tableName = null; private String[] scoreNames = {"Sum score", "Average score", "Kelley score", "Percentile rank", "Normalized score"}; private HashMap<String, String> scoreNameConversion = null; private String scoreType = "sum"; static Logger logger = Logger.getLogger("jmetrik-logger"); public TestScalingDialog(JFrame parent, DatabaseName dbName, DataTableName tableName, ArrayList <VariableAttributes> variables){ super(parent,"Test Scaling",true); setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE); this.dbName = dbName; this.tableName = tableName; //HashMap for converting combobox text to command argument name scoreNameConversion = new HashMap<String, String>(); scoreNameConversion.put(scoreNames[0], "sum"); scoreNameConversion.put(scoreNames[1], "mean"); scoreNameConversion.put(scoreNames[2], "kelley"); scoreNameConversion.put(scoreNames[3], "prank"); scoreNameConversion.put(scoreNames[4], "normal"); //prevent running an analysis when window close button is clicked this.addWindowListener(new WindowAdapter(){ @Override public void windowClosing(WindowEvent e){ canRun = false; } }); vsp = new MultipleSelectionPanel(); //Filter out not item // VariableType filterType1 = new VariableType(ItemType.NOT_ITEM, DataType.STRING); // VariableType filterType4 = new VariableType(ItemType.NOT_ITEM, DataType.DOUBLE); // vsp.addUnselectedFilterType(filterType1); // vsp.addUnselectedFilterType(filterType4); // vsp.addSelectedFilterType(filterType1); // vsp.addSelectedFilterType(filterType4); vsp.addUnselectedFilterItemType(ItemType.NOT_ITEM); vsp.setVariables(variables); vsp.showButton4(false); JButton b1 = vsp.getButton1(); b1.setText("Run"); b1.addActionListener(new RunActionListener()); JButton b2 = vsp.getButton2(); b2.setText("Cancel"); b2.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { canRun =false; setVisible(false); } }); JButton b3 = vsp.getButton3(); b3.setText("Clear"); b3.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { vsp.reset(); nameTextField.setText(""); meanTextField.setText(""); stdDevTextField.setText(""); minTextField.setText(""); maxTextField.setText(""); precisionTextField.setText(""); } }); initComponents(); setResizable(false); setLocationRelativeTo(parent); setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE); } private void initComponents() { scorePanel = new JPanel(); nameLabel = new JLabel(); nameTextField = new JTextField(); typeLabel = new JLabel(); scoreNameComboBox = new JComboBox(); transformationPanel = new JPanel(); meanLabel = new JLabel(); stdDevLabel = new JLabel(); meanTextField = new JTextField(); stdDevTextField = new JTextField(); constraintPanel = new JPanel(); minLabel = new JLabel(); minTextField = new JTextField(); maxLabel = new JLabel(); maxTextField = new JTextField(); precisionLabel = new JLabel(); precisionTextField = new JTextField(); scorePanel.setBorder(BorderFactory.createTitledBorder("Score")); nameLabel.setText("Name"); nameTextField.setMaximumSize(new Dimension(200, 28)); nameTextField.setMinimumSize(new Dimension(200, 28)); nameTextField.setPreferredSize(new Dimension(200, 28)); typeLabel.setText("Type"); scoreNameComboBox.setModel(new DefaultComboBoxModel(scoreNames)); scoreNameComboBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JComboBox cb = (JComboBox) e.getSource(); String s = (String) cb.getSelectedItem(); scoreType = scoreNameConversion.get(s); } }); scoreNameComboBox.setMaximumSize(new Dimension(200, 28)); scoreNameComboBox.setMinimumSize(new Dimension(200, 28)); scoreNameComboBox.setPreferredSize(new Dimension(200, 28)); GroupLayout scorePanelLayout = new GroupLayout(scorePanel); scorePanel.setLayout(scorePanelLayout); scorePanelLayout.setHorizontalGroup( scorePanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(scorePanelLayout.createSequentialGroup() .addContainerGap() .addGroup(scorePanelLayout.createParallelGroup(GroupLayout.Alignment.TRAILING) .addComponent(typeLabel) .addComponent(nameLabel)) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(scorePanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING, false) .addComponent(nameTextField, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(scoreNameComboBox, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap(161, Short.MAX_VALUE)) ); scorePanelLayout.setVerticalGroup( scorePanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(scorePanelLayout.createSequentialGroup() .addContainerGap() .addGroup(scorePanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(nameLabel) .addComponent(nameTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(scorePanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(scoreNameComboBox, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(typeLabel)) .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); transformationPanel.setBorder(BorderFactory.createTitledBorder("Linear Transformation")); meanLabel.setText("Mean"); stdDevLabel.setText("Std. Dev."); meanTextField.setMaximumSize(new Dimension(75, 28)); meanTextField.setMinimumSize(new Dimension(75, 28)); meanTextField.setPreferredSize(new Dimension(75, 28)); stdDevTextField.setMaximumSize(new Dimension(75, 28)); stdDevTextField.setMinimumSize(new Dimension(75, 28)); stdDevTextField.setPreferredSize(new Dimension(75, 28)); GroupLayout transformationPanelLayout = new GroupLayout(transformationPanel); transformationPanel.setLayout(transformationPanelLayout); transformationPanelLayout.setHorizontalGroup( transformationPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(transformationPanelLayout.createSequentialGroup() .addContainerGap() .addGroup(transformationPanelLayout.createParallelGroup(GroupLayout.Alignment.TRAILING) .addComponent(stdDevLabel) .addComponent(meanLabel)) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(transformationPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addComponent(meanTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(stdDevTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) .addContainerGap(50, Short.MAX_VALUE)) ); transformationPanelLayout.setVerticalGroup( transformationPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(transformationPanelLayout.createSequentialGroup() .addContainerGap() .addGroup(transformationPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(meanLabel) .addComponent(meanTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(transformationPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(stdDevTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(stdDevLabel)) .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); constraintPanel.setBorder(BorderFactory.createTitledBorder("Constraints")); minLabel.setText("Minimum"); minTextField.setMaximumSize(new Dimension(75, 28)); minTextField.setMinimumSize(new Dimension(75, 28)); minTextField.setPreferredSize(new Dimension(75, 28)); maxLabel.setText("Maximum"); maxTextField.setMaximumSize(new Dimension(75, 28)); maxTextField.setMinimumSize(new Dimension(75, 28)); maxTextField.setPreferredSize(new Dimension(75, 28)); precisionLabel.setText("Precision"); precisionTextField.setMaximumSize(new Dimension(75, 28)); precisionTextField.setMinimumSize(new Dimension(75, 28)); precisionTextField.setPreferredSize(new Dimension(75, 28)); GroupLayout constraintPanelLayout = new GroupLayout(constraintPanel); constraintPanel.setLayout(constraintPanelLayout); constraintPanelLayout.setHorizontalGroup( constraintPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(constraintPanelLayout.createSequentialGroup() .addContainerGap() .addGroup(constraintPanelLayout.createParallelGroup(GroupLayout.Alignment.TRAILING) .addComponent(precisionLabel) .addComponent(maxLabel) .addComponent(minLabel)) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(constraintPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addComponent(minTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(maxTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(precisionTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); constraintPanelLayout.setVerticalGroup( constraintPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(constraintPanelLayout.createSequentialGroup() .addContainerGap() .addGroup(constraintPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(minLabel) .addComponent(minTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(constraintPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(maxTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(maxLabel)) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(constraintPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(precisionTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(precisionLabel)) .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); GroupLayout layout = new GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING, false) .addComponent(vsp, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(scorePanel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addGap(0, 0, Short.MAX_VALUE)) .addGroup(layout.createSequentialGroup() .addComponent(transformationPanel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addComponent(constraintPanel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(vsp, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(scorePanel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING, false) .addComponent(constraintPanel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(transformationPanel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); pack(); }// </editor-fold> public boolean canRun(){ return canRun; } public TestScalingCommand getCommand(){ return command; } public VariableAttributes[] getSelectedVariables(){ return vsp.getSelectedVariables(); } public VariableChangeListener getVariableChangedListener(){ return vsp.getVariableChangedListener(); } public class RunActionListener implements ActionListener{ public void actionPerformed(ActionEvent e){ VariableAttributes[] v = vsp.getSelectedVariables(); if(v.length>0){ try{ command = new TestScalingCommand(); for(int i=0;i<v.length;i++){ command.getFreeOptionList("variables").addValue((v[i]).getName().toString()); } command.getPairedOptionList("data").addValue("db", dbName.toString()); command.getPairedOptionList("data").addValue("table", tableName.toString()); String n = nameTextField.getText().trim(); if(n.equals("")) n = "score"; VariableName vName = new VariableName(n); command.getFreeOption("name").add(vName.toString()); command.getSelectOneOption("score").setSelected(scoreType); if(minTextField.getText().equals("")){ command.getPairedOptionList("constraints").addValue("min", Double.NEGATIVE_INFINITY); }else{ command.getPairedOptionList("constraints").addValue("min", Double.parseDouble(minTextField.getText())); } if(maxTextField.getText().equals("")){ command.getPairedOptionList("constraints").addValue("max", Double.POSITIVE_INFINITY); }else{ command.getPairedOptionList("constraints").addValue("max", Double.parseDouble(maxTextField.getText())); } if(precisionTextField.getText().equals("")){ command.getPairedOptionList("constraints").addValue("precision", 2); }else{ command.getPairedOptionList("constraints").addValue("precision", Integer.parseInt(precisionTextField.getText())); } if((!meanTextField.getText().trim().equals("") && stdDevTextField.getText().trim().equals("")) || (meanTextField.getText().trim().equals("") && !stdDevTextField.getText().trim().equals(""))){ JOptionPane.showMessageDialog(TestScalingDialog.this, "You must specify a mean and standard deviation \n for the linear transformation", "Linear Transformation Error", JOptionPane.ERROR_MESSAGE); }else{ if(!meanTextField.getText().trim().equals("")){ Double m = Double.parseDouble(meanTextField.getText().trim()); command.getPairedOptionList("transform").addValue("mean", m); } if(!stdDevTextField.getText().trim().equals("")){ Double m = Double.parseDouble(stdDevTextField.getText().trim()); command.getPairedOptionList("transform").addValue("sd", m); } } canRun=true; setVisible(false); }catch(IllegalArgumentException ex){ logger.fatal(ex.getMessage(), ex); firePropertyChange("error", "", "Error - Check log for details."); } } } }//end RunAction }