/* * 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 com.itemanalysis.jmetrik.dao.DatabaseAccessObject; import com.itemanalysis.jmetrik.model.SortedListModel; import com.itemanalysis.jmetrik.model.VariableListFilter; import com.itemanalysis.jmetrik.model.VariableListModel; import com.itemanalysis.jmetrik.sql.DataTableName; import com.itemanalysis.jmetrik.sql.VariableTableName; import com.itemanalysis.psychometrics.data.DataType; import com.itemanalysis.psychometrics.data.ItemType; import com.itemanalysis.psychometrics.data.VariableAttributes; import org.apache.log4j.Logger; import javax.swing.*; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.sql.Connection; import java.sql.SQLException; import java.util.ArrayList; public class IrtLinkingItemDialog extends JDialog{ // Variables declaration - do not modify private JButton cancelButton; private JButton difficultyButton; private JLabel difficultyLabel; private JTextField difficultyTextField; private JButton discriminationButton; private JLabel discriminationLabel; private JTextField discriminationTextField; private JButton guessingButton; private JLabel guessingLabel; private JTextField guessingTextField; private JList variableList; private JButton okButton; private JList tableList; private JScrollPane tableListScrollPane; private JButton thresholdButton; private JLabel thresholdLabel; private JList thresholdList; private JScrollPane thresholdScrollPane; private JScrollPane variableListScrollPane; // End of variables declaration private Connection conn = null; private DatabaseAccessObject dao = null; private SortedListModel<DataTableName> tableListModel = null; private VariableListModel variableListModel = null; private VariableListModel thresholdListModel = null; private boolean selectDifficulty = true; private boolean selectThreshold = true; private boolean selectDiscrimination = true; private boolean selectGuessing = true; private VariableAttributes difficultyVariable = null; private VariableAttributes discriminationVariable = null; private VariableAttributes guessingVariable = null; private DataTableName currentTable = null; private int numberOfParameters; static Logger logger = Logger.getLogger("jmetrik-logger"); /** Creates new form IrtEquatingItemDialog */ public IrtLinkingItemDialog(JDialog parent, Connection conn, DatabaseAccessObject dao, SortedListModel<DataTableName> tableListModel, String formName) { super(parent, formName+" Item Parameters", true); this.conn = conn; this.dao = dao; this.tableListModel = tableListModel; initComponents(); setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE); setLocationRelativeTo(parent); } /** 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() { tableListScrollPane = new JScrollPane(); tableList = new JList(); tableList.setName("tableList"); tableList.setModel(tableListModel); tableList.addListSelectionListener(new TableSelectionListener()); variableListScrollPane = new JScrollPane(); variableList = new JList(); variableList.setName("unselectedVariableList"); variableList.addFocusListener(new ListFocusListener()); difficultyLabel = new JLabel(); difficultyTextField = new JTextField(); difficultyTextField.setName("selectedDifficultyList"); difficultyTextField.addFocusListener(new ListFocusListener()); thresholdLabel = new JLabel(); thresholdScrollPane = new JScrollPane(); thresholdList = new JList(); thresholdList.setName("selectedThresholdList"); thresholdList.addFocusListener(new ListFocusListener()); discriminationLabel = new JLabel(); discriminationTextField = new JTextField(); discriminationTextField.setName("selectedDiscriminationList"); discriminationTextField.addFocusListener(new ListFocusListener()); guessingLabel = new JLabel(); guessingTextField = new JTextField(); guessingTextField.setName("selectedGuessingList"); guessingTextField.addFocusListener(new ListFocusListener()); difficultyButton = new JButton(); thresholdButton = new JButton(); discriminationButton = new JButton(); guessingButton = new JButton(); okButton = new JButton(); okButton.setText("OK"); okButton.setMaximumSize(new Dimension(69, 28)); okButton.setMinimumSize(new Dimension(69, 28)); okButton.setPreferredSize(new Dimension(69, 28)); okButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if(difficultyVariable==null){ JOptionPane.showMessageDialog(IrtLinkingItemDialog.this, "You must select a difficulty parameter.", "Incomplete Information", JOptionPane.ERROR_MESSAGE); }else{ setVisible(false); } } }); cancelButton = new JButton(); cancelButton.setText("Cancel"); cancelButton.setMaximumSize(new Dimension(69, 28)); cancelButton.setMinimumSize(new Dimension(69, 28)); cancelButton.setPreferredSize(new Dimension(69, 28)); cancelButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { setVisible(false); } }); setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); tableListScrollPane.setBorder(null); tableListScrollPane.setMinimumSize(new Dimension(125, 300)); tableListScrollPane.setPreferredSize(new Dimension(125, 300)); tableListScrollPane.setViewportView(tableList); variableListScrollPane.setBorder(null); variableListScrollPane.setMinimumSize(new Dimension(125, 300)); variableListScrollPane.setPreferredSize(new Dimension(125, 300)); //filter out items and strings // VariableListFilter listFilter = new VariableListFilter(); // listFilter.addFilteredType(new VariableType(ItemType.BINARY_ITEM, DataType.STRING)); // listFilter.addFilteredType(new VariableType(ItemType.BINARY_ITEM, DataType.DOUBLE)); // listFilter.addFilteredType(new VariableType(ItemType.POLYTOMOUS_ITEM, DataType.STRING)); // listFilter.addFilteredType(new VariableType(ItemType.POLYTOMOUS_ITEM, DataType.DOUBLE)); // listFilter.addFilteredType(new VariableType(ItemType.CONTINUOUS_ITEM, DataType.STRING)); // listFilter.addFilteredType(new VariableType(ItemType.CONTINUOUS_ITEM, DataType.DOUBLE)); // listFilter.addFilteredType(new VariableType(ItemType.NOT_ITEM, DataType.STRING)); VariableListFilter listFilter = new VariableListFilter(); listFilter.addFilteredItemType(ItemType.BINARY_ITEM); listFilter.addFilteredItemType(ItemType.POLYTOMOUS_ITEM); listFilter.addFilteredItemType(ItemType.CONTINUOUS_ITEM); listFilter.addFilteredDataType(DataType.STRING); variableListModel = new VariableListModel(listFilter); variableList.setModel(variableListModel); variableListScrollPane.setViewportView(variableList); difficultyLabel.setText("Difficulty"); difficultyTextField.setMinimumSize(new Dimension(150, 28)); difficultyTextField.setPreferredSize(new Dimension(150, 28)); thresholdLabel.setText("Thresholds"); thresholdScrollPane.setMinimumSize(new Dimension(150, 100)); thresholdScrollPane.setPreferredSize(new Dimension(150, 100)); // VariableListFilter listFilter2 = new VariableListFilter(); // listFilter2.addFilteredType(new VariableType(ItemType.BINARY_ITEM, DataType.STRING)); // listFilter2.addFilteredType(new VariableType(ItemType.BINARY_ITEM, DataType.DOUBLE)); // listFilter2.addFilteredType(new VariableType(ItemType.POLYTOMOUS_ITEM, DataType.STRING)); // listFilter2.addFilteredType(new VariableType(ItemType.POLYTOMOUS_ITEM, DataType.DOUBLE)); // listFilter2.addFilteredType(new VariableType(ItemType.CONTINUOUS_ITEM, DataType.STRING)); // listFilter2.addFilteredType(new VariableType(ItemType.CONTINUOUS_ITEM, DataType.DOUBLE)); // listFilter2.addFilteredType(new VariableType(ItemType.NOT_ITEM, DataType.STRING)); VariableListFilter listFilter2 = new VariableListFilter(); listFilter2.addFilteredItemType(ItemType.BINARY_ITEM); listFilter2.addFilteredItemType(ItemType.POLYTOMOUS_ITEM); listFilter2.addFilteredItemType(ItemType.CONTINUOUS_ITEM); listFilter2.addFilteredDataType(DataType.STRING); thresholdListModel = new VariableListModel(listFilter2); thresholdList.setModel(thresholdListModel); thresholdScrollPane.setViewportView(thresholdList); discriminationLabel.setText("Discrimination"); discriminationTextField.setMinimumSize(new Dimension(150, 28)); discriminationTextField.setPreferredSize(new Dimension(150, 28)); guessingLabel.setText("Guessing"); guessingTextField.setMinimumSize(new Dimension(150, 28)); guessingTextField.setPreferredSize(new Dimension(150, 28)); difficultyButton.setText(">"); difficultyButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if(selectDifficulty){ //move selected variable to selectedList int selected = variableList.getSelectedIndex(); difficultyVariable = variableListModel.getElementAt(selected); difficultyTextField.setText(difficultyVariable.getName().toString()); variableListModel.removeElement(difficultyVariable); variableList.clearSelection(); numberOfParameters++; }else{ if(difficultyVariable!=null){ variableListModel.addElement(difficultyVariable); difficultyVariable=null; difficultyTextField.setText(""); numberOfParameters--; } } } }); difficultyButton.setMaximumSize(new Dimension(49, 28)); difficultyButton.setMinimumSize(new Dimension(49, 28)); difficultyButton.setPreferredSize(new Dimension(49, 28)); thresholdButton.setText(">"); thresholdButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if(selectThreshold){ //move selected variable to selectedList int[] selected = variableList.getSelectedIndices(); for(int i=0;i<selected.length;i++){ thresholdListModel.addElement(variableListModel.getElementAt(selected[i])); } for(int i=0;i<thresholdListModel.getSize();i++){ variableListModel.removeElement(thresholdListModel.getElementAt(i)); } variableList.clearSelection(); }else{ //move selectedVariables to unselected list int[] selected = thresholdList.getSelectedIndices(); for(int i=0;i<selected.length;i++){ variableListModel.addElement(thresholdListModel.getElementAt(selected[i])); } for(int i=0; i <variableListModel.getSize();i++){ thresholdListModel.removeElement(variableListModel.getElementAt(i)); } thresholdList.clearSelection(); } } }); thresholdButton.setMaximumSize(new Dimension(49, 28)); thresholdButton.setMinimumSize(new Dimension(49, 28)); thresholdButton.setPreferredSize(new Dimension(49, 28)); discriminationButton.setText(">"); discriminationButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if(selectDiscrimination){ //move selected variable to selectedList int selected = variableList.getSelectedIndex(); discriminationVariable = variableListModel.getElementAt(selected); discriminationTextField.setText(discriminationVariable.getName().toString()); variableListModel.removeElement(discriminationVariable); variableList.clearSelection(); numberOfParameters++; }else{ if(discriminationVariable!=null){ variableListModel.addElement(discriminationVariable); discriminationVariable=null; discriminationTextField.setText(""); numberOfParameters--; } } } }); discriminationButton.setMaximumSize(new Dimension(49, 28)); discriminationButton.setMinimumSize(new Dimension(49, 28)); discriminationButton.setPreferredSize(new Dimension(49, 28)); guessingButton.setText(">"); guessingButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if(selectGuessing){ //move selected variable to selectedList int selected = variableList.getSelectedIndex(); guessingVariable = variableListModel.getElementAt(selected); guessingTextField.setText(guessingVariable.getName().toString()); variableListModel.removeElement(guessingVariable); variableList.clearSelection(); numberOfParameters++; }else{ if(guessingVariable!=null){ variableListModel.addElement(guessingVariable); guessingVariable=null; guessingTextField.setText(""); numberOfParameters--; } } } }); guessingButton.setMaximumSize(new Dimension(49, 28)); guessingButton.setMinimumSize(new Dimension(49, 28)); guessingButton.setPreferredSize(new Dimension(49, 28)); GroupLayout layout = new GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(tableListScrollPane, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(variableListScrollPane, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(okButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addComponent(cancelButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addComponent(difficultyButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(thresholdButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(discriminationButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(guessingButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING, false) .addComponent(difficultyLabel) .addComponent(thresholdLabel) .addComponent(thresholdScrollPane, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(discriminationLabel) .addComponent(discriminationTextField, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(guessingLabel) .addComponent(guessingTextField, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(difficultyTextField, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))) .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(difficultyLabel) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(difficultyTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(difficultyButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(thresholdLabel) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(thresholdScrollPane, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(discriminationLabel) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(discriminationTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(discriminationButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(guessingLabel) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(guessingTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(guessingButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))) .addComponent(thresholdButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))) .addComponent(variableListScrollPane, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(tableListScrollPane, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, 11, Short.MAX_VALUE) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(okButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(cancelButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) .addContainerGap()) ); pack(); }// </editor-fold> private void reset(){ difficultyButton.setEnabled(true); difficultyButton.setText(">"); difficultyButton.setToolTipText("Select variable"); thresholdButton.setEnabled(true); thresholdButton.setText(">"); thresholdButton.setToolTipText("SelectVariable"); discriminationButton.setEnabled(true); discriminationButton.setText(">"); discriminationButton.setToolTipText("Select Variable"); guessingButton.setEnabled(true); guessingButton.setText(">"); guessingButton.setToolTipText("SelectVariable"); variableList.clearSelection(); difficultyTextField.setText(""); difficultyVariable = null; thresholdListModel.clear(); discriminationTextField.setText(""); discriminationVariable = null; guessingTextField.setText(""); guessingVariable = null; numberOfParameters = 0; } private void openTable(DataTableName tableName){ try{ if(currentTable!=null && currentTable.equals(tableName)) return; VariableTableName variableTableName = new VariableTableName(tableName.toString()); ArrayList<VariableAttributes> v = dao.getAllVariables(conn, variableTableName); setVariables(v); currentTable = tableName; }catch(SQLException ex){ logger.fatal(ex.getMessage(), ex); JOptionPane.showMessageDialog(IrtLinkingItemDialog.this, "Table could not be opened.", "SQL Exception", JOptionPane.ERROR_MESSAGE); } } private void setVariables(ArrayList<VariableAttributes> variables){ reset(); variableListModel.clear(); for(VariableAttributes v : variables){ variableListModel.addElement(v); } } public boolean canRun(){ return difficultyVariable!=null; } public DataTableName getTableName(){ return (DataTableName)tableList.getSelectedValue(); } public int getNumberOfParameters(){ return numberOfParameters; } public VariableAttributes getDifficultyVariable(){ return difficultyVariable; } public VariableAttributes[] getThresholdVariables(){ return thresholdListModel.getAll(); } public VariableAttributes getDiscriminationVariable(){ return discriminationVariable; } public VariableAttributes getGuessingVariable(){ return guessingVariable; } public class ListFocusListener implements FocusListener { public void focusGained(FocusEvent e){ String compName = e.getComponent().getName(); if(compName!=null){ if("unselectedVariableList".equals(compName)){ if(difficultyVariable!=null) difficultyButton.setEnabled(false); if(discriminationVariable!=null) discriminationButton.setEnabled(false); if(guessingVariable!=null) guessingButton.setEnabled(false); difficultyButton.setText(">"); difficultyButton.setToolTipText("Select variable"); selectDifficulty = true; thresholdButton.setText(">"); thresholdButton.setToolTipText("SelectVariable"); selectThreshold = true; discriminationButton.setText(">"); discriminationButton.setToolTipText("Select Variable"); selectDiscrimination = true; guessingButton.setText(">"); guessingButton.setToolTipText("SelectVariable"); selectGuessing = true; } if("selectedDifficultyList".equals(compName)){ difficultyButton.setText("<"); difficultyButton.setEnabled(true); discriminationButton.setToolTipText("Unselect variable"); selectDifficulty = false; } if("selectedThresholdList".equals(compName)){ thresholdButton.setText("<"); thresholdButton.setEnabled(true); thresholdButton.setToolTipText("Unselect variable"); selectThreshold = false; } if("selectedDiscriminationList".equals(compName)){ discriminationButton.setText("<"); discriminationButton.setEnabled(true); discriminationButton.setToolTipText("Unselect variable"); selectDiscrimination = false; } if("selectedGuessingList".equals(compName)){ guessingButton.setText("<"); guessingButton.setEnabled(true); guessingButton.setToolTipText("Unselect variable"); selectGuessing = false; } } } public void focusLost(FocusEvent e){ //do nothing } } public class TableSelectionListener implements ListSelectionListener{ public void valueChanged(ListSelectionEvent e){ DataTableName tableName = (DataTableName)tableList.getSelectedValue(); if(tableName!=null){ openTable(tableName); } } } }