/* * 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.irt.linking; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.sql.Connection; import javax.swing.JOptionPane; import com.itemanalysis.jmetrik.dao.DatabaseAccessObject; import com.itemanalysis.jmetrik.dao.DatabaseType; import com.itemanalysis.jmetrik.dao.DerbyDatabaseAccessObject; import com.itemanalysis.jmetrik.dao.JmetrikDatabaseFactory; import com.itemanalysis.jmetrik.model.SortedListModel; import com.itemanalysis.jmetrik.sql.DataTableName; import com.itemanalysis.jmetrik.sql.DatabaseName; import com.itemanalysis.jmetrik.workspace.JmetrikPreferencesManager; import org.apache.log4j.Logger; public class IrtLinkingDialogOld extends JDialog{ private Connection conn = null; private DatabaseAccessObject dao = null; private boolean canRun = false; private IrtLinkingItemPairDialog itemPairDialog = null; private IrtLinkingItemDialog itemDialogX = null; private IrtLinkingItemDialog itemDialogY = null; private IrtLinkingThetaDialog thetaDialogX = null; private IrtLinkingThetaDialog thetaDialogY = null; private IrtLinkingCommand command = null; static Logger logger = Logger.getLogger("jmetrik-logger"); private DataTableName tableX = null; private DataTableName tableY = null; private DataTableName tableXtheta = null; private DataTableName tableYtheta = null; private static String FORMX = "Form X"; private static String FORMY = "Form Y"; private boolean transformItems = false; private boolean transformPersons = false; private DatabaseName dbName = null; private SortedListModel<DataTableName> tableListModel; // Variables declaration - do not modify private JRadioButton biasedButton; private JLabel binLabel; private JTextField binsField; private JPanel buttonPanel; private JButton cancelButton; private ButtonGroup criterionGroup; private JPanel criterionPanel; private ButtonGroup distributionGroup; private JPanel distributionPanel; private JRadioButton formXCriterionButton; private JButton formXItemButton; private JTextField formXItemField; private JButton formXPersonButton; private JTextField formXPersonField; private JLabel formXPersonLabel; private JRadioButton formXYDistributionButton; private JRadioButton formYDistributionButton; private JButton formYItemButton; private JTextField formYItemField; private JButton formYPersonButton; private JTextField formYPersonField; private JLabel formYPersonLabel; private JRadioButton hbButton; private JRadioButton histogramButton; private JCheckBox itemBox; private JPanel itemPanel; private JLabel jLabel1; private JLabel jLabel2; private JLabel jLabel3; private JRadioButton logisticButton; private JTextField maxField; private JLabel maxLabel; private JTextField meanField; private JLabel meanLabel; private JPanel methodPanel; private JTextField minField; private JLabel minLabel; private JRadioButton mmButton; private JRadioButton msButton; private JRadioButton normalButton; private JRadioButton normalOgiveButton; private JRadioButton observedButton; private JButton okButton; private JCheckBox personBox; private JPanel personPanel; private JTextField precisionField; private JLabel precisionLabel; private JButton resetButton; private ButtonGroup scaleGroup; private JPanel scalePanel; private JTextField sdField; private ButtonGroup sdGroup; private JLabel sdLabel; private JPanel sdPanel; private JRadioButton slButton; private JPanel transformPanel; private ButtonGroup transformationGroup; private JRadioButton unbiasedButton; private JRadioButton uniformButton; private JTextField xyItemField; private JButton xyPairButton; // End of variables declaration /** Creates new form IrtEquatingDialogOld */ public IrtLinkingDialogOld(JFrame parent, Connection conn, DatabaseName dbName, SortedListModel<DataTableName> tableListModel) { super(parent, "IRT Equating", true); this.conn = conn; this.dbName = dbName; this.tableListModel = tableListModel; initComponents(); setResizable(false); setLocationRelativeTo(parent); //set type of database according to properties JmetrikPreferencesManager preferencesManager = new JmetrikPreferencesManager(); String dbType = preferencesManager.getDatabaseType(); JmetrikDatabaseFactory dbFactory; if(DatabaseType.APACHE_DERBY.toString().equals(dbType)){ dao = new DerbyDatabaseAccessObject(); dbFactory = new JmetrikDatabaseFactory(DatabaseType.APACHE_DERBY); }else if(DatabaseType.MYSQL.toString().equals(dbType)){ //not yet implemented }else{ //default is apache derby dao = new DerbyDatabaseAccessObject(); dbFactory = new JmetrikDatabaseFactory(DatabaseType.APACHE_DERBY); } //prevent running an analysis when window close button is clicked this.addWindowListener(new WindowAdapter(){ @Override public void windowClosing(WindowEvent e){ canRun = false; } }); binsField.setEditable(false); meanField.setEditable(false); sdField.setEditable(false); minField.setEditable(false); maxField.setEditable(false); formXPersonButton.setEnabled(true); formYPersonButton.setEnabled(true); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { GridBagConstraints gridBagConstraints; distributionGroup = new ButtonGroup(); criterionGroup = new ButtonGroup(); scaleGroup = new ButtonGroup(); sdGroup = new ButtonGroup(); transformationGroup = new ButtonGroup(); itemPanel = new JPanel(); jLabel1 = new JLabel(); formXItemButton = new JButton(); jLabel2 = new JLabel(); formYItemButton = new JButton(); jLabel3 = new JLabel(); xyPairButton = new JButton(); formXItemField = new JTextField(); formYItemField = new JTextField(); xyItemField = new JTextField(); distributionPanel = new JPanel(); observedButton = new JRadioButton(); histogramButton = new JRadioButton(); binsField = new JTextField(); normalButton = new JRadioButton(); meanField = new JTextField(); meanLabel = new JLabel(); sdLabel = new JLabel(); sdField = new JTextField(); binLabel = new JLabel(); uniformButton = new JRadioButton(); minLabel = new JLabel(); minField = new JTextField(); maxLabel = new JLabel(); maxField = new JTextField(); personPanel = new JPanel(); formXPersonLabel = new JLabel(); formXPersonButton = new JButton(); formYPersonLabel = new JLabel(); formYPersonButton = new JButton(); formXPersonField = new JTextField(); formYPersonField = new JTextField(); sdPanel = new JPanel(); biasedButton = new JRadioButton(); unbiasedButton = new JRadioButton(); criterionPanel = new JPanel(); formXCriterionButton = new JRadioButton(); formYDistributionButton = new JRadioButton(); formXYDistributionButton = new JRadioButton(); scalePanel = new JPanel(); logisticButton = new JRadioButton(); normalOgiveButton = new JRadioButton(); buttonPanel = new JPanel(); okButton = new JButton(); cancelButton = new JButton(); resetButton = new JButton(); methodPanel = new JPanel(); msButton = new JRadioButton(); mmButton = new JRadioButton(); hbButton = new JRadioButton(); slButton = new JRadioButton(); transformPanel = new JPanel(); itemBox = new JCheckBox(); personBox = new JCheckBox(); precisionLabel = new JLabel(); precisionField = new JTextField(); setTitle("IRT Equating"); setModal(true); setResizable(false); getContentPane().setLayout(new GridBagLayout()); itemPanel.setBorder(BorderFactory.createTitledBorder("Item Parameters")); itemPanel.setPreferredSize(new Dimension(300, 140)); itemPanel.setLayout(new GridBagLayout()); jLabel1.setText("Form X"); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.gridwidth = 5; gridBagConstraints.anchor = GridBagConstraints.WEST; gridBagConstraints.insets = new Insets(0, 5, 5, 5); itemPanel.add(jLabel1, gridBagConstraints); formXItemButton.setText("Select"); formXItemButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { if(itemDialogX==null){ itemDialogX = new IrtLinkingItemDialog(IrtLinkingDialogOld.this, conn, dao, tableListModel, FORMX); } itemDialogX.setVisible(true); if(itemDialogX.canRun()){ tableX = itemDialogX.getTableName(); formXItemField.setText(tableX.toString()); } } }); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 6; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = GridBagConstraints.WEST; gridBagConstraints.insets = new Insets(0, 0, 5, 5); itemPanel.add(formXItemButton, gridBagConstraints); jLabel2.setText("Form Y"); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.gridwidth = 5; gridBagConstraints.anchor = GridBagConstraints.WEST; gridBagConstraints.insets = new Insets(0, 5, 5, 5); itemPanel.add(jLabel2, gridBagConstraints); formYItemButton.setText("Select"); formYItemButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { if(itemDialogY==null){ itemDialogY = new IrtLinkingItemDialog(IrtLinkingDialogOld.this, conn, dao, tableListModel, FORMY); } itemDialogY.setVisible(true); if(itemDialogY.canRun()){ tableY = itemDialogY.getTableName(); formYItemField.setText(tableY.toString()); } } }); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 6; gridBagConstraints.gridy = 1; gridBagConstraints.anchor = GridBagConstraints.WEST; gridBagConstraints.insets = new Insets(0, 0, 5, 5); itemPanel.add(formYItemButton, gridBagConstraints); jLabel3.setText("XY Pairs"); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.gridwidth = 5; gridBagConstraints.anchor = GridBagConstraints.WEST; gridBagConstraints.insets = new Insets(0, 5, 5, 5); itemPanel.add(jLabel3, gridBagConstraints); xyPairButton.setText("Select"); xyPairButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { if(itemDialogX!=null && itemDialogY!=null){ if(itemDialogX.getNumberOfParameters()!=itemDialogY.getNumberOfParameters()){ JOptionPane.showMessageDialog(IrtLinkingDialogOld.this, "You have mismatched IRT models for Form X and Form Y.\n" + "Make sure you have the same number of model parameters for each form.", "Parameter Mismatch", JOptionPane.ERROR_MESSAGE); }else{ if(itemPairDialog==null){ itemPairDialog = new IrtLinkingItemPairDialog(IrtLinkingDialogOld.this, conn, tableX, tableY); // itemDialogX.addTableSelectionListener(itemPairDialog); // itemDialogY.addTableSelectionListener(itemPairDialog); } itemPairDialog.setVisible(true); if(itemPairDialog.canRun()){ xyItemField.setText(itemPairDialog.numberOfPairs() + " item pairs created"); } } } } }); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 6; gridBagConstraints.gridy = 2; gridBagConstraints.anchor = GridBagConstraints.WEST; gridBagConstraints.insets = new Insets(0, 0, 5, 5); itemPanel.add(xyPairButton, gridBagConstraints); formXItemField.setColumns(30); formXItemField.setEditable(false); formXItemField.setToolTipText("Form X item parameter data"); formXItemField.setPreferredSize(new Dimension(100, 25)); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 5; gridBagConstraints.gridy = 0; gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 0.5; gridBagConstraints.insets = new Insets(0, 0, 5, 5); itemPanel.add(formXItemField, gridBagConstraints); formYItemField.setEditable(false); formYItemField.setToolTipText("Form Y item data"); formYItemField.setPreferredSize(new Dimension(100, 25)); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 5; gridBagConstraints.gridy = 1; gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 0.5; gridBagConstraints.insets = new Insets(0, 0, 5, 5); itemPanel.add(formYItemField, gridBagConstraints); xyItemField.setEditable(false); xyItemField.setToolTipText("Number of common items"); xyItemField.setPreferredSize(new Dimension(100, 25)); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 5; gridBagConstraints.gridy = 2; gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 0.5; gridBagConstraints.insets = new Insets(0, 0, 5, 5); itemPanel.add(xyItemField, gridBagConstraints); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.gridwidth = 4; gridBagConstraints.fill = GridBagConstraints.BOTH; gridBagConstraints.weightx = 0.8; gridBagConstraints.insets = new Insets(5, 5, 5, 5); getContentPane().add(itemPanel, gridBagConstraints); distributionPanel.setBorder(BorderFactory.createTitledBorder("Person Distribution")); distributionPanel.setPreferredSize(new Dimension(300, 140)); distributionPanel.setLayout(new GridBagLayout()); distributionGroup.add(observedButton); observedButton.setSelected(true); observedButton.setText("Observed Values"); observedButton.setToolTipText("Observed values"); observedButton.setActionCommand("observed"); observedButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { observedButtonActionPerformed(evt); } }); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.gridwidth = 4; gridBagConstraints.anchor = GridBagConstraints.WEST; gridBagConstraints.insets = new Insets(0, 0, 5, 5); distributionPanel.add(observedButton, gridBagConstraints); distributionGroup.add(histogramButton); histogramButton.setText("Histogram"); histogramButton.setToolTipText("Histogram of observed values"); histogramButton.setActionCommand("histogram"); histogramButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { histogramButtonActionPerformed(evt); } }); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.gridwidth = 4; gridBagConstraints.anchor = GridBagConstraints.WEST; gridBagConstraints.insets = new Insets(0, 0, 5, 5); distributionPanel.add(histogramButton, gridBagConstraints); binsField.setColumns(10); binsField.setText(" "); binsField.setToolTipText("Number of histogram bins"); binsField.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { binsFieldActionPerformed(evt); } }); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 6; gridBagConstraints.gridy = 1; gridBagConstraints.gridwidth = 8; gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = GridBagConstraints.WEST; gridBagConstraints.weightx = 0.5; gridBagConstraints.insets = new Insets(0, 0, 5, 5); distributionPanel.add(binsField, gridBagConstraints); distributionGroup.add(normalButton); normalButton.setText("Normal"); normalButton.setToolTipText("Normal distribution"); normalButton.setActionCommand("normal"); normalButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { normalButtonActionPerformed(evt); } }); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.gridwidth = 4; gridBagConstraints.anchor = GridBagConstraints.WEST; gridBagConstraints.insets = new Insets(0, 0, 5, 5); distributionPanel.add(normalButton, gridBagConstraints); meanField.setColumns(10); meanField.setText("0"); meanField.setToolTipText("Distribution mean"); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 6; gridBagConstraints.gridy = 2; gridBagConstraints.gridwidth = 8; gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = GridBagConstraints.WEST; gridBagConstraints.weightx = 0.5; gridBagConstraints.insets = new Insets(0, 0, 5, 5); distributionPanel.add(meanField, gridBagConstraints); meanLabel.setText("Mean"); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 4; gridBagConstraints.gridy = 2; gridBagConstraints.gridwidth = 2; gridBagConstraints.anchor = GridBagConstraints.WEST; gridBagConstraints.insets = new Insets(0, 0, 5, 5); distributionPanel.add(meanLabel, gridBagConstraints); sdLabel.setText("SD"); sdLabel.setToolTipText("Standard Deviation"); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 14; gridBagConstraints.gridy = 2; gridBagConstraints.gridwidth = 2; gridBagConstraints.anchor = GridBagConstraints.WEST; gridBagConstraints.insets = new Insets(0, 0, 5, 5); distributionPanel.add(sdLabel, gridBagConstraints); sdField.setColumns(10); sdField.setText("1"); sdField.setToolTipText("Distribution standard deviation"); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 16; gridBagConstraints.gridy = 2; gridBagConstraints.gridwidth = 8; gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = GridBagConstraints.WEST; gridBagConstraints.weightx = 0.5; gridBagConstraints.insets = new Insets(0, 0, 5, 5); distributionPanel.add(sdField, gridBagConstraints); binLabel.setText("Bins"); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 4; gridBagConstraints.gridy = 1; gridBagConstraints.gridwidth = 2; gridBagConstraints.anchor = GridBagConstraints.WEST; gridBagConstraints.insets = new Insets(0, 0, 5, 5); distributionPanel.add(binLabel, gridBagConstraints); distributionGroup.add(uniformButton); uniformButton.setText("Uniform"); uniformButton.setToolTipText("Uniform Distribution"); uniformButton.setActionCommand("uniform"); uniformButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { uniformButtonActionPerformed(evt); } }); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 3; gridBagConstraints.gridwidth = 4; gridBagConstraints.anchor = GridBagConstraints.WEST; gridBagConstraints.insets = new Insets(0, 0, 5, 5); distributionPanel.add(uniformButton, gridBagConstraints); minLabel.setText("Min"); minLabel.setToolTipText("Minimum Value"); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 4; gridBagConstraints.gridy = 3; gridBagConstraints.gridwidth = 2; gridBagConstraints.anchor = GridBagConstraints.WEST; gridBagConstraints.insets = new Insets(0, 0, 5, 5); distributionPanel.add(minLabel, gridBagConstraints); minField.setColumns(10); minField.setText("-4"); minField.setToolTipText("Minimum value"); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 6; gridBagConstraints.gridy = 3; gridBagConstraints.gridwidth = 8; gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = GridBagConstraints.WEST; gridBagConstraints.weightx = 0.5; gridBagConstraints.insets = new Insets(0, 0, 5, 5); distributionPanel.add(minField, gridBagConstraints); maxLabel.setText("Max"); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 14; gridBagConstraints.gridy = 3; gridBagConstraints.gridwidth = 2; gridBagConstraints.anchor = GridBagConstraints.WEST; gridBagConstraints.insets = new Insets(0, 0, 5, 5); distributionPanel.add(maxLabel, gridBagConstraints); maxField.setColumns(10); maxField.setText("4"); maxField.setToolTipText("Maximum value"); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 16; gridBagConstraints.gridy = 3; gridBagConstraints.gridwidth = 8; gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = GridBagConstraints.WEST; gridBagConstraints.weightx = 0.5; gridBagConstraints.insets = new Insets(0, 0, 5, 5); distributionPanel.add(maxField, gridBagConstraints); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.gridwidth = 4; gridBagConstraints.fill = GridBagConstraints.BOTH; gridBagConstraints.anchor = GridBagConstraints.NORTHWEST; gridBagConstraints.weightx = 0.8; gridBagConstraints.insets = new Insets(5, 5, 5, 5); getContentPane().add(distributionPanel, gridBagConstraints); personPanel.setBorder(BorderFactory.createTitledBorder("Person Data")); personPanel.setPreferredSize(new Dimension(300, 100)); personPanel.setLayout(new GridBagLayout()); formXPersonLabel.setText("Form X"); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new Insets(0, 5, 5, 5); personPanel.add(formXPersonLabel, gridBagConstraints); formXPersonButton.setText("Select"); formXPersonButton.setToolTipText("Select Form X person data"); formXPersonButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { if(thetaDialogX==null){ thetaDialogX = new IrtLinkingThetaDialog(IrtLinkingDialogOld.this, conn, dao, tableListModel, FORMX); // thetaDialogX.addTableSelectionListener(this); } thetaDialogX.setVisible(true); } }); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 0; gridBagConstraints.insets = new Insets(0, 0, 5, 5); personPanel.add(formXPersonButton, gridBagConstraints); formYPersonLabel.setText("Form Y"); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new Insets(0, 5, 5, 5); personPanel.add(formYPersonLabel, gridBagConstraints); formYPersonButton.setText("Select"); formYPersonButton.setToolTipText("Select Form Y person data"); formYPersonButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { if(thetaDialogY==null){ thetaDialogY = new IrtLinkingThetaDialog(IrtLinkingDialogOld.this, conn, dao, tableListModel, FORMX); // thetaDialogY.addTableSelectionListener(this); } thetaDialogY.setVisible(true); } }); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 1; gridBagConstraints.insets = new Insets(0, 0, 5, 5); personPanel.add(formYPersonButton, gridBagConstraints); formXPersonField.setEditable(false); formXPersonField.setToolTipText("Form x person parameter data"); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 0; gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 0.5; gridBagConstraints.insets = new Insets(0, 0, 5, 5); personPanel.add(formXPersonField, gridBagConstraints); formYPersonField.setEditable(false); formYPersonField.setToolTipText("Form y person parameter data"); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 1; gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 0.5; gridBagConstraints.insets = new Insets(0, 0, 5, 5); personPanel.add(formYPersonField, gridBagConstraints); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.gridwidth = 4; gridBagConstraints.fill = GridBagConstraints.BOTH; gridBagConstraints.weightx = 0.8; gridBagConstraints.insets = new Insets(5, 5, 5, 5); getContentPane().add(personPanel, gridBagConstraints); sdPanel.setBorder(BorderFactory.createTitledBorder("Standard Deviation")); sdPanel.setPreferredSize(new Dimension(150, 100)); sdPanel.setLayout(new GridLayout(2, 1)); sdGroup.add(biasedButton); biasedButton.setSelected(true); biasedButton.setText("Biased"); biasedButton.setToolTipText("Uses N in denominator"); biasedButton.setActionCommand("biased"); sdPanel.add(biasedButton); sdGroup.add(unbiasedButton); unbiasedButton.setText("Unbiased"); unbiasedButton.setToolTipText("Uses N-1 in denominator"); unbiasedButton.setActionCommand("unbiased"); sdPanel.add(unbiasedButton); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 4; gridBagConstraints.gridy = 1; gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = GridBagConstraints.BOTH; gridBagConstraints.weightx = 0.4; gridBagConstraints.insets = new Insets(0, 0, 5, 5); getContentPane().add(sdPanel, gridBagConstraints); criterionPanel.setBorder(BorderFactory.createTitledBorder("Criterion Function")); criterionPanel.setPreferredSize(new Dimension(150, 120)); criterionPanel.setLayout(new GridLayout(3, 1, 5, 0)); criterionGroup.add(formXCriterionButton); formXCriterionButton.setText("Form X Distribution"); formXCriterionButton.setToolTipText("Distribution of theta for Form X"); formXCriterionButton.setActionCommand("x"); criterionPanel.add(formXCriterionButton); criterionGroup.add(formYDistributionButton); formYDistributionButton.setText("Form Y Distribution"); formYDistributionButton.setToolTipText("Distribution of theta for Form Y"); formYDistributionButton.setActionCommand("y"); criterionPanel.add(formYDistributionButton); criterionGroup.add(formXYDistributionButton); formXYDistributionButton.setSelected(true); formXYDistributionButton.setText("Form X and Form Y"); formXYDistributionButton.setToolTipText("Distribution of theta for Form X and Form Y (Symmetric)"); formXYDistributionButton.setActionCommand("xy"); criterionPanel.add(formXYDistributionButton); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 4; gridBagConstraints.gridy = 2; gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = GridBagConstraints.BOTH; gridBagConstraints.weightx = 0.4; gridBagConstraints.insets = new Insets(0, 0, 5, 5); getContentPane().add(criterionPanel, gridBagConstraints); scalePanel.setBorder(BorderFactory.createTitledBorder("Scale")); scalePanel.setPreferredSize(new Dimension(150, 120)); scalePanel.setLayout(new GridLayout(2, 1)); scaleGroup.add(logisticButton); logisticButton.setSelected(true); logisticButton.setText("Logistic"); logisticButton.setToolTipText("Use logistic scale (D = 1.0)"); logisticButton.setActionCommand("logistic"); scalePanel.add(logisticButton); scaleGroup.add(normalOgiveButton); normalOgiveButton.setText("Normal Ogive"); normalOgiveButton.setToolTipText("Use normal ogive scale (D = 1.7)"); normalOgiveButton.setActionCommand("normal"); scalePanel.add(normalOgiveButton); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 4; gridBagConstraints.gridy = 0; gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = GridBagConstraints.BOTH; gridBagConstraints.weightx = 0.4; gridBagConstraints.insets = new Insets(0, 0, 5, 5); getContentPane().add(scalePanel, gridBagConstraints); buttonPanel.setPreferredSize(new Dimension(550, 25)); buttonPanel.setLayout(new GridBagLayout()); okButton.setText("OK"); okButton.setToolTipText("OK"); okButton.setMaximumSize(new Dimension(65, 23)); okButton.setMinimumSize(new Dimension(65, 23)); okButton.setPreferredSize(new Dimension(65, 23)); okButton.addActionListener(new OkActionListener()); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new Insets(0, 0, 5, 5); buttonPanel.add(okButton, gridBagConstraints); cancelButton.setText("Cancel"); cancelButton.setToolTipText("Cancel"); cancelButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { cancelButtonActionPerformed(evt); } }); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new Insets(0, 0, 5, 5); buttonPanel.add(cancelButton, gridBagConstraints); resetButton.setText("Reset"); resetButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { resetDialogs(); } }); resetButton.setMaximumSize(new Dimension(65, 23)); resetButton.setMinimumSize(new Dimension(65, 23)); resetButton.setPreferredSize(new Dimension(65, 23)); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new Insets(0, 0, 5, 5); buttonPanel.add(resetButton, gridBagConstraints); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 4; gridBagConstraints.gridwidth = 6; gridBagConstraints.insets = new Insets(5, 5, 5, 5); getContentPane().add(buttonPanel, gridBagConstraints); methodPanel.setBorder(BorderFactory.createTitledBorder("Transformation Method")); methodPanel.setLayout(new GridLayout(2, 2)); transformationGroup.add(msButton); msButton.setText("Mean/Sigma"); msButton.setToolTipText("Mean/Sigma transformation method"); msButton.setActionCommand("ms"); methodPanel.add(msButton); transformationGroup.add(mmButton); mmButton.setText("Mean/Mean"); mmButton.setToolTipText("Mean/Mean transformation method"); mmButton.setActionCommand("mm"); methodPanel.add(mmButton); transformationGroup.add(hbButton); hbButton.setText("Haebara"); hbButton.setToolTipText("Haebara transformation method"); hbButton.setActionCommand("hb"); methodPanel.add(hbButton); transformationGroup.add(slButton); slButton.setSelected(true); slButton.setText("Stocking-Lord"); slButton.setToolTipText("Stocking-Lord transformation method"); slButton.setActionCommand("sl"); methodPanel.add(slButton); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 3; gridBagConstraints.gridwidth = 4; gridBagConstraints.fill = GridBagConstraints.BOTH; gridBagConstraints.insets = new Insets(5, 5, 5, 5); getContentPane().add(methodPanel, gridBagConstraints); transformPanel.setBorder(BorderFactory.createTitledBorder("Transform")); transformPanel.setLayout(new GridBagLayout()); itemBox.setText("Item Parameters"); itemBox.setToolTipText("Tansform Form X item parameters"); itemBox.setActionCommand("item"); itemBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { itemBoxActionPerformed(evt); } }); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new Insets(0, 0, 5, 5); transformPanel.add(itemBox, gridBagConstraints); personBox.setText("Person Parameters"); personBox.setToolTipText("Transform Form X person parameters"); personBox.setActionCommand("person"); personBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { personBoxActionPerformed(evt); } }); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new Insets(0, 0, 5, 5); transformPanel.add(personBox, gridBagConstraints); precisionLabel.setText("Precision"); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.weightx = 0.5; gridBagConstraints.insets = new Insets(0, 0, 5, 5); transformPanel.add(precisionLabel, gridBagConstraints); precisionField.setColumns(10); precisionField.setText("4"); precisionField.setToolTipText("Number of decimal places in scaling coefficients"); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 2; gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 0.5; gridBagConstraints.insets = new Insets(0, 0, 5, 5); transformPanel.add(precisionField, gridBagConstraints); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 4; gridBagConstraints.gridy = 3; gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = GridBagConstraints.BOTH; gridBagConstraints.insets = new Insets(0, 0, 5, 5); getContentPane().add(transformPanel, gridBagConstraints); pack(); }// </editor-fold> private void observedButtonActionPerformed(ActionEvent evt) { binsField.setEditable(false); meanField.setEditable(false); sdField.setEditable(false); minField.setEditable(false); maxField.setEditable(false); formXPersonButton.setEnabled(true); formYPersonButton.setEnabled(true); } private void histogramButtonActionPerformed(ActionEvent evt) { binsField.setEditable(true); meanField.setEditable(false); sdField.setEditable(false); minField.setEditable(false); maxField.setEditable(false); formXPersonButton.setEnabled(true); formYPersonButton.setEnabled(true); } private void normalButtonActionPerformed(ActionEvent evt) { binsField.setEditable(false); meanField.setEditable(true); sdField.setEditable(true); minField.setEditable(false); maxField.setEditable(false); formXPersonButton.setEnabled(false); formYPersonButton.setEnabled(false); } private void uniformButtonActionPerformed(ActionEvent evt) { binsField.setEditable(false); meanField.setEditable(false); sdField.setEditable(false); minField.setEditable(true); maxField.setEditable(true); formXPersonButton.setEnabled(false); formYPersonButton.setEnabled(false); } private void formYItemButtonActionPerformed(ActionEvent evt) { } private void formXPersonButtonActionPerformed(ActionEvent evt) { } private void formYPersonButtonActionPerformed(ActionEvent evt) { } public class OkActionListener implements ActionListener { public void actionPerformed(ActionEvent evt){ try{ command = new IrtLinkingCommand(); boolean hasItem = false; boolean hasItemPair = false; boolean hasItemX = false; boolean hasItemY = false; boolean hasThetaX = false; boolean hasThetaY = false; boolean hasObserved = false; boolean hasUniform = false; boolean hasNormal = false; boolean hasDistribution = false; boolean hasBins = false; if(itemDialogX!=null && itemDialogX.canRun()){ command.getPairedOptionList("xitem").addValue("db", dbName.toString()); command.getPairedOptionList("xitem").addValue("table", tableX.toString()); command.getPairedOptionList("xitem").addValue("difficulty", itemDialogX.getDifficultyVariable().getName().toString()); command.getPairedOptionList("xitem").addValue("discrimination", itemDialogX.getDiscriminationVariable().getName().toString()); command.getPairedOptionList("xitem").addValue("guessing", itemDialogX.getGuessingVariable().getName().toString()); hasItemX = true; }else{ JOptionPane.showMessageDialog(IrtLinkingDialogOld.this, "Be sure you have selected Form X item parameters.", "Error", JOptionPane.ERROR_MESSAGE); } if(itemDialogY!=null && itemDialogY.canRun()){ command.getPairedOptionList("yitem").addValue("table", tableY.toString()); command.getPairedOptionList("yitem").addValue("difficulty", itemDialogY.getDifficultyVariable().toString()); command.getPairedOptionList("yitem").addValue("discrimination", itemDialogY.getDiscriminationVariable().toString()); command.getPairedOptionList("yitem").addValue("guessing", itemDialogY.getGuessingVariable().toString()); hasItemY = true; }else{ JOptionPane.showMessageDialog(IrtLinkingDialogOld.this, "Be sure you have selected Form Y item parameters.", "Error", JOptionPane.ERROR_MESSAGE); } hasItem = (hasItemX && hasItemY); String distributionAction = distributionGroup.getSelection().getActionCommand(); command.getSelectOneOption("distribution").setSelected(distributionAction); if(distributionAction.equals("observed") || distributionAction.equals("histogram")){ if(thetaDialogX!=null && thetaDialogX.canRun()){ command.getPairedOptionList("xability").addValue("table", tableXtheta.toString()); command.getPairedOptionList("xability").addValue("theta", thetaDialogX.getTheta().getName().toString()); command.getPairedOptionList("xability").addValue("weight", thetaDialogX.getWeight().getName().toString()); hasThetaX = true; }else{ JOptionPane.showMessageDialog(IrtLinkingDialogOld.this, "Be sure you have selected a Form X person parameter.", "Error", JOptionPane.ERROR_MESSAGE); } if(thetaDialogY!=null && thetaDialogY.canRun()){ command.getPairedOptionList("yability").addValue("table", tableYtheta.toString()); command.getPairedOptionList("yability").addValue("theta", thetaDialogY.getTheta().getName().toString()); command.getPairedOptionList("yability").addValue("weight", thetaDialogY.getWeight().getName().toString()); hasThetaY = true; }else{ JOptionPane.showMessageDialog(IrtLinkingDialogOld.this, "Be sure you have selected a Form Y person parameter.", "Error", JOptionPane.ERROR_MESSAGE); } hasObserved = (hasThetaX && hasThetaY); if(distributionAction.equals("histogram")){ if(binsField.getText().trim().equals("")){ command.getSelectOneOption("binmethod").setSelected("sturges"); }else{ int bins = Math.abs(Integer.parseInt(binsField.getText().trim())); command.getFreeOption("bins").add(bins); } hasBins = true; }else if(distributionAction.equals("observed")){ command.getSelectOneOption("binmethod").setSelected("all"); hasBins = true; } }else if(distributionAction.equals("uniform")){ int min = Integer.parseInt(minField.getText().trim()); int max = Integer.parseInt(maxField.getText().trim()); command.getPairedOptionList("uniform").addValue("min", min); command.getPairedOptionList("uniform").addValue("max", max); command.getPairedOptionList("uniform").addValue("bins", 10);//FIXME give user options to change this value hasUniform = true; }else{ //normal distribution double mean = Double.parseDouble(meanField.getText().trim()); double sd = Double.parseDouble(sdField.getText().trim()); command.getPairedOptionList("normal").addValue("mean", mean); command.getPairedOptionList("normal").addValue("sd", sd); command.getPairedOptionList("normal").addValue("bins", 10);//FIXME give user options to change this value hasNormal = true; } hasDistribution = ((hasObserved && hasBins) || hasUniform || hasNormal); if(itemPairDialog!=null && itemPairDialog.canRun()){ Object[] obj = itemPairDialog.getSelectedPairs(); for(int i=0;i<obj.length;i++){ String xyp = ((LinkingItemPair)obj[i]).commandString(); command.getFreeOptionList("xypairs").addValue(xyp); } hasItemPair = true; }else{ JOptionPane.showMessageDialog(IrtLinkingDialogOld.this, "Be sure you have selected Form X and Form Y item pairs.", "Error", JOptionPane.ERROR_MESSAGE); } int precision = 4; if(!precisionField.getText().trim().equals("")){ precision = Integer.parseInt(precisionField.getText().trim()); } command.getSelectOneOption("popsd").setSelected(sdGroup.getSelection().getActionCommand()); command.getSelectOneOption("scale").setSelected(scaleGroup.getSelection().getActionCommand()); command.getSelectOneOption("criterion").setSelected(criterionGroup.getSelection().getActionCommand()); command.getSelectOneOption("method").setSelected(transformationGroup.getSelection().getActionCommand()); command.getSelectAllOption("transform").setSelected("items", transformItems); command.getSelectAllOption("transform").setSelected("persons", transformPersons); command.getFreeOption("precision").add(precision); canRun = (hasItem && hasItemPair && hasDistribution); if(canRun){ setVisible(false); } }catch(IllegalArgumentException ex){ logger.fatal(ex.getMessage(), ex); JOptionPane.showMessageDialog(IrtLinkingDialogOld.this, ex.getMessage(), "Syntax Error", JOptionPane.ERROR_MESSAGE); } } } private void binsFieldActionPerformed(ActionEvent evt) { // TODO add your handling code here: } private void cancelButtonActionPerformed(ActionEvent evt) { canRun=false; setVisible(false); } private void itemBoxActionPerformed(ActionEvent evt) { if(itemBox.isSelected()) transformItems=true; else transformItems=false; } private void personBoxActionPerformed(ActionEvent evt) { if(personBox.isSelected()) transformPersons=true; else transformPersons=false; } public boolean canRun(){ return canRun; } public IrtLinkingCommand getCommand(){ return command; } public void resetDialogs(){ itemPairDialog.dispose(); itemPairDialog=null; itemDialogX.dispose(); itemDialogX=null; itemDialogY.dispose(); itemDialogY=null; thetaDialogX.dispose(); thetaDialogX=null; thetaDialogY.dispose(); thetaDialogY=null; } // public class TableSelectionListener implements ListSelectionListener{ // public void tableChanged(ListSelectionEvent e){ // if(e.itemList()){ // if(e.getId().equals("Form X")){ // tableX = e.getTableName(); // formXItemField.setText(tableX.toString()); // }else{ // tableY = e.getTableName(); // formYItemField.setText(tableY.toString()); // } // }else{ // if(e.getId().equals("Form X")){ // tableXtheta = e.getTableName(); // formXPersonField.setText(tableXtheta.toString()); // }else{ // tableYtheta = e.getTableName(); // formYPersonField.setText(tableYtheta.toString()); // } // } // } // // // // } }