/*
* 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
}
}
}