/* * 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 IrtLinkingThetaDialog extends JDialog{ // Variables declaration - do not modify private JButton cancelButton; private JList variableList; private JButton okButton; private JList tableList; private JScrollPane tableScrollPane; private JButton thetaButton; private JLabel thetaLabel; private JTextField thetaTextField1; private JScrollPane variableScrollPane; private JButton weightButton; private JLabel weightLabel; private JTextField weightTextField; // End of variables declaration private String formName = ""; private Connection conn = null; private DatabaseAccessObject dao = null; private DataTableName currentTable = null; private SortedListModel<DataTableName> tableListModel = null; private VariableListModel variableListModel = null; private boolean canRun = false; private boolean selectTheta = true; private boolean selectWeight = true; private VariableAttributes thetaVariable = null; private VariableAttributes weightVariable = null; static Logger logger = Logger.getLogger("jmetrik-logger"); /** Creates new form IrtEquatingThetaDialog */ public IrtLinkingThetaDialog(JDialog parent, Connection conn, DatabaseAccessObject dao, SortedListModel<DataTableName> tableListModel, String formName) { super(parent, formName+" Person Parameters", true); this.conn = conn; this.dao = dao; this.tableListModel = tableListModel; initComponents(); setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE); setLocationRelativeTo(parent); setResizable(false); } /** 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() { tableScrollPane = new JScrollPane(); tableList = new JList(); tableList.setName("tableList"); tableList.setModel(tableListModel); tableList.addListSelectionListener(new TableSelectionListener()); variableScrollPane = new JScrollPane(); variableList = new JList(); variableList.setName("unselectedVariableList"); variableList.addFocusListener(new ListFocusListener()); thetaLabel = new JLabel(); weightTextField = new JTextField(); weightTextField.setName("selectedWeightList"); weightTextField.addFocusListener(new ListFocusListener()); thetaButton = new JButton(); weightLabel = new JLabel(); thetaTextField1 = new JTextField(); thetaTextField1.setName("selectedThetaList"); thetaTextField1.addFocusListener(new ListFocusListener()); weightButton = new JButton(); okButton = new JButton(); cancelButton = new JButton(); tableScrollPane.setMinimumSize(new Dimension(150, 300)); tableScrollPane.setPreferredSize(new Dimension(150, 300)); tableScrollPane.setViewportView(tableList); variableScrollPane.setMinimumSize(new Dimension(150, 300)); variableScrollPane.setPreferredSize(new Dimension(150, 300)); //filter out items and strings // VariableListFilter listFilter = new VariableListFilter(); // listFilter.addFilteredType(new VariableType(VariableType.BINARY_ITEM, VariableType.STRING)); // listFilter.addFilteredType(new VariableType(VariableType.BINARY_ITEM, VariableType.DOUBLE)); // listFilter.addFilteredType(new VariableType(VariableType.POLYTOMOUS_ITEM, VariableType.STRING)); // listFilter.addFilteredType(new VariableType(VariableType.POLYTOMOUS_ITEM, VariableType.DOUBLE)); // listFilter.addFilteredType(new VariableType(VariableType.CONTINUOUS_ITEM, VariableType.STRING)); // listFilter.addFilteredType(new VariableType(VariableType.CONTINUOUS_ITEM, VariableType.DOUBLE)); // listFilter.addFilteredType(new VariableType(VariableType.NOT_ITEM, VariableType.STRING)); //filter out items and strings 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); variableScrollPane.setViewportView(variableList); thetaLabel.setText("Theta"); weightTextField.setMinimumSize(new Dimension(150, 25)); weightTextField.setPreferredSize(new Dimension(150, 25)); thetaButton.setText(">"); thetaButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if(selectTheta){ //move selected variable to selectedList int selected = variableList.getSelectedIndex(); thetaVariable = variableListModel.getElementAt(selected); thetaTextField1.setText(thetaVariable.getName().toString()); variableListModel.removeElement(thetaVariable); variableList.clearSelection(); }else{ if(thetaVariable!=null){ variableListModel.addElement(thetaVariable); thetaVariable=null; thetaTextField1.setText(""); } } } }); thetaButton.setMaximumSize(new Dimension(49, 25)); thetaButton.setMinimumSize(new Dimension(49, 25)); thetaButton.setPreferredSize(new Dimension(49, 25)); weightLabel.setText("Weight"); thetaTextField1.setMinimumSize(new Dimension(150, 25)); thetaTextField1.setPreferredSize(new Dimension(150, 25)); weightButton.setText(">"); weightButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if(selectWeight){ //move selected variable to selectedList int selected = variableList.getSelectedIndex(); weightVariable = variableListModel.getElementAt(selected); weightTextField.setText(weightVariable.getName().toString()); variableListModel.removeElement(weightVariable); variableList.clearSelection(); }else{ if(weightVariable!=null){ variableListModel.addElement(weightVariable); weightVariable=null; weightTextField.setText(""); } } } }); weightButton.setMaximumSize(new Dimension(49, 25)); weightButton.setMinimumSize(new Dimension(49, 25)); weightButton.setPreferredSize(new Dimension(49, 25)); okButton.setText("OK"); okButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { setVisible(false); } }); okButton.setMaximumSize(new Dimension(69, 25)); okButton.setMinimumSize(new Dimension(69, 25)); okButton.setPreferredSize(new Dimension(69, 25)); cancelButton.setText("Cancel"); cancelButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { setVisible(false); } }); cancelButton.setMaximumSize(new Dimension(69, 25)); cancelButton.setMinimumSize(new Dimension(69, 25)); cancelButton.setPreferredSize(new Dimension(69, 25)); GroupLayout layout = new GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(tableScrollPane, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(variableScrollPane, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING) .addComponent(thetaButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(weightButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addComponent(thetaLabel) .addComponent(weightLabel) .addComponent(weightTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(thetaTextField1, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))) .addGroup(GroupLayout.Alignment.TRAILING, 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) .addGap(12, 12, 12))) .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() .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addComponent(variableScrollPane, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(tableScrollPane, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addGroup(layout.createSequentialGroup() .addComponent(thetaLabel) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(thetaButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(thetaTextField1, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) .addGap(33, 33, 33) .addComponent(weightLabel) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(weightTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(weightButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, 146, 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)) .addGap(19, 19, 19)))) ); pack(); }// </editor-fold> private void reset(){ thetaButton.setEnabled(true); thetaButton.setText(">"); thetaButton.setToolTipText("Select variable"); weightButton.setEnabled(true); weightButton.setText(">"); weightButton.setToolTipText("SelectVariable"); variableList.clearSelection(); thetaTextField1.setText(""); thetaVariable = null; weightTextField.setText(""); weightVariable = null; } private void setVariables(ArrayList<VariableAttributes> variables){ reset(); variableListModel.clear(); for(VariableAttributes v : variables){ variableListModel.addElement(v); } } 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(IrtLinkingThetaDialog.this, "Table could not be opened.", "SQL Exception", JOptionPane.ERROR_MESSAGE); } } public DataTableName getTableName(){ return currentTable; } public boolean canRun(){ return thetaVariable!=null; } public VariableAttributes getTheta(){ return thetaVariable; } public VariableAttributes getWeight(){ return weightVariable; } public boolean hasTheta(){ return thetaVariable!=null; } public boolean hasWeight(){ return weightVariable!=null; } public class TableSelectionListener implements ListSelectionListener { public void valueChanged(ListSelectionEvent e){ DataTableName tableName = (DataTableName)tableList.getSelectedValue(); if(tableName!=null){ openTable(tableName); } } } public class ListFocusListener implements FocusListener { public void focusGained(FocusEvent e){ String compName = e.getComponent().getName(); if(compName!=null){ if("unselectedVariableList".equals(compName)){ if(thetaVariable!=null) thetaButton.setEnabled(true); if(weightVariable!=null) weightButton.setEnabled(true); thetaButton.setText(">"); thetaButton.setToolTipText("Select variable"); selectTheta = true; weightButton.setText(">"); weightButton.setToolTipText("SelectVariable"); selectWeight = true; } if("selectedThetaList".equals(compName)){ thetaButton.setText("<"); thetaButton.setEnabled(true); thetaButton.setToolTipText("Unselect variable"); selectTheta = false; } if("selectedWeightList".equals(compName)){ weightButton.setText("<"); weightButton.setEnabled(true); weightButton.setToolTipText("Unselect variable"); selectWeight = false; } } } public void focusLost(FocusEvent e){ //do nothing } } }