/*
* 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.rasch;
import com.itemanalysis.jmetrik.dao.DatabaseAccessObject;
import com.itemanalysis.jmetrik.model.SortedListModel;
import com.itemanalysis.jmetrik.sql.DataTableName;
import com.itemanalysis.jmetrik.sql.DatabaseName;
import com.itemanalysis.jmetrik.sql.VariableTableName;
import com.itemanalysis.psychometrics.data.VariableAttributes;
import com.itemanalysis.psychometrics.data.VariableName;
import org.apache.log4j.Logger;
import javax.swing.*;
import javax.swing.border.TitledBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
public class RaschItemStartValuesDialog extends JDialog{
private DatabaseName dbName = null;
private DataTableName tableName = null;
private DataTableName startTableName = null;
private JTable table = null;
private RaschStartValueTableModel model = null;
private boolean hasValidTable = false;
private JList tableList = null;
private DataTableName currentTable = null;
private Connection conn = null;
private DatabaseAccessObject dao = null;
static Logger logger = Logger.getLogger("jmetrik-logger");
public RaschItemStartValuesDialog(RaschDialog parent, Connection conn, DatabaseAccessObject dao, SortedListModel<DataTableName> tableListModel){
super(parent, "Item Start Values", true);
setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
this.conn = conn;
this.dao = dao;
tableList = new JList(tableListModel);
tableList.setName("tableList");
tableList.addListSelectionListener(new TableSelectionListener());
table = new JTable(new DefaultTableModel());
JPanel mainPanel = new JPanel();
mainPanel.setLayout(new GridBagLayout());
mainPanel.setPreferredSize(new Dimension(450,350));
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;
c.gridwidth = 2;
c.gridheight = 6;
c.weightx = 1;
c.weighty = 1;
c.anchor = GridBagConstraints.NORTHWEST;
c.fill = GridBagConstraints.BOTH;
mainPanel.add(getTreePanel(),c);
c.gridx = 2;
c.gridy = 0;
c.gridwidth = 4;
c.gridheight = 6;
c.weightx = 1;
c.weighty = 1;
c.anchor = GridBagConstraints.NORTHWEST;
c.fill = GridBagConstraints.BOTH;
mainPanel.add(getTablePanel(),c);
c.gridx = 0;
c.gridy = 6;
c.gridwidth = 6;
c.gridheight = 1;
c.weightx = 1;
c.weighty = 1;
c.anchor = GridBagConstraints.SOUTH;
c.fill = GridBagConstraints.BOTH;
mainPanel.add(getButtonPanel(),c);
//add main panel to this
getContentPane().add(mainPanel,BorderLayout.CENTER);
pack();
setResizable(false);
setLocationRelativeTo(parent);
}
public final JScrollPane getTreePanel(){
JScrollPane sp = new JScrollPane();
sp.setPreferredSize(new Dimension(150,300));
sp.getViewport().add(tableList);
sp.setBorder(new TitledBorder("Table List"));
return sp;
}
public final JScrollPane getTablePanel(){
JScrollPane sp = new JScrollPane();
sp.setPreferredSize(new Dimension(300,300));
sp.getViewport().add(table);
sp.setBorder(new TitledBorder("Start and Fixed Value Specification"));
return sp;
}
public final JPanel getButtonPanel(){
JPanel panel = new JPanel();
panel.setLayout( new GridBagLayout());
panel.setPreferredSize(new Dimension(400,50));
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;
c.gridwidth = 4;
c.gridheight = 1;
c.weightx = 1;
c.weighty = 1;
c.anchor = GridBagConstraints.CENTER;
c.fill = GridBagConstraints.HORIZONTAL;
panel.add(new JPanel(),c);
JButton okButton = new JButton(new OkAction("OK"));
c.gridx = 4;
c.gridy = 0;
c.gridwidth = 2;
c.gridheight = 1;
c.weightx = 1;
c.weighty = 1;
c.anchor = GridBagConstraints.CENTER;
c.fill = GridBagConstraints.HORIZONTAL;
panel.add(okButton,c);
c.gridx = 6;
c.gridy = 0;
c.gridwidth = 1;
c.gridheight = 1;
c.weightx = 1;
c.weighty = 1;
c.anchor = GridBagConstraints.CENTER;
c.fill = GridBagConstraints.HORIZONTAL;
panel.add(new JPanel(),c);
JButton cancelButton = new JButton(new OkAction("Cancel"));
c.gridx = 7;
c.gridy = 0;
c.gridwidth = 2;
c.gridheight = 1;
c.weightx = 1;
c.weighty = 1;
c.anchor = GridBagConstraints.CENTER;
c.fill = GridBagConstraints.HORIZONTAL;
panel.add(cancelButton,c);
c.gridx = 9;
c.gridy = 0;
c.gridwidth = 4;
c.gridheight = 1;
c.weightx = 1;
c.weighty = 1;
c.anchor = GridBagConstraints.CENTER;
c.fill = GridBagConstraints.HORIZONTAL;
panel.add(new JPanel(),c);
return panel;
}
public boolean hasValidTable(){
return hasValidTable;
}
public Boolean hasStartValueNames(){
RaschStartValueTableModel m = (RaschStartValueTableModel)table.getModel();
return m.hasStartValueNames();
}
public Boolean hasFixedValueNames(){
RaschStartValueTableModel m = (RaschStartValueTableModel)table.getModel();
return m.hasFixedValueNames();
}
public ArrayList<VariableName> getFixedValueNames(){
RaschStartValueTableModel m = (RaschStartValueTableModel)table.getModel();
return m.getFixedValueNames();
}
public DatabaseName getStartDatabase(){
return dbName;
}
public DataTableName getStartTable(){
return startTableName;
}
private void setVariables(ArrayList<VariableAttributes> variables){
model = new RaschStartValueTableModel(variables);
table.setModel(model);
model.fireTableDataChanged();
}
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(RaschItemStartValuesDialog.this,
"Table could not be opened.",
"SQL Exception",
JOptionPane.ERROR_MESSAGE);
}
}
public class OkAction extends AbstractAction{
private static final long serialVersionUID = 1L;
final static String TOOL_TIP = "Run analysis";
public OkAction(String text, ImageIcon icon, Integer mnemonic){
super(text, icon);
putValue(SHORT_DESCRIPTION, TOOL_TIP);
putValue(MNEMONIC_KEY, mnemonic);
}
public OkAction(String text, ImageIcon icon){
super(text, icon);
putValue(SHORT_DESCRIPTION, TOOL_TIP);
}
public OkAction(String text){
super(text);
putValue(SHORT_DESCRIPTION, TOOL_TIP);
}
public void actionPerformed(ActionEvent e){
//do something
setVisible(false);
}
}//end RunAction
public class CancelAction extends AbstractAction{
private static final long serialVersionUID = 1L;
final static String TOOL_TIP = "Cancel";
public CancelAction(String text, ImageIcon icon, Integer mnemonic){
super(text, icon);
putValue(SHORT_DESCRIPTION, TOOL_TIP);
putValue(MNEMONIC_KEY, mnemonic);
}
public CancelAction(String text, ImageIcon icon){
super(text, icon);
putValue(SHORT_DESCRIPTION, TOOL_TIP);
}
public CancelAction(String text){
super(text);
putValue(SHORT_DESCRIPTION, TOOL_TIP);
}
public void actionPerformed(ActionEvent e){
setVisible(false);
}
}//end CancelAction
public class TableSelectionListener implements ListSelectionListener {
public void valueChanged(ListSelectionEvent e){
DataTableName tableName = (DataTableName)tableList.getSelectedValue();
if(tableName!=null){
openTable(tableName);
}
}
}
}