/*
* 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.selector;
import com.itemanalysis.jmetrik.model.VariableListFilter;
import com.itemanalysis.jmetrik.model.VariableListModel;
import com.itemanalysis.jmetrik.workspace.VariableChangeEvent;
import com.itemanalysis.jmetrik.workspace.VariableChangeListener;
import com.itemanalysis.jmetrik.workspace.VariableChangeType;
import com.itemanalysis.psychometrics.data.DataType;
import com.itemanalysis.psychometrics.data.ItemType;
import com.itemanalysis.psychometrics.data.VariableAttributes;
import javax.swing.*;
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.util.ArrayList;
public class SelectionXYByGroupPanel extends JPanel implements VariableChangeListener{
// Variables declaration - do not modify
private JButton button1;
private JButton groupButton;
private JTextField groupByTextField;
private JLabel groupLabel;
private JButton button2;
private JButton button3;
private JButton button4;
private JList unselectedVariableList;
private JScrollPane unselectedVariablePane;
private JButton xButton;
private JLabel xLabel;
private JTextField xTextField;
private JButton yButton;
private JLabel yLabel;
private JTextField yTextField;
private VariableListModel unselectedListModel;
private VariableListFilter unselectedVariableFilter;
private VariableListFilter selectedXVariableFilter;
private VariableListFilter selectedYVariableFilter;
private VariableListFilter groupByVariableFilter;
private VariableAttributes selectedXVariable;
private VariableAttributes selectedYVariable;
private VariableAttributes groupByVariable;
private String nameTextField1 = "X:";
private String nameTextField2 = "Y:";
private String nameGroupTextField = "Group by:";
/**
* If true, variables moved from unselectedVariableList to selectedList.
* If false, variables moved from selectedList to unselectedVariableList.
*/
private boolean selectXVariables = true;
private boolean selectYVariables = true;
private boolean selectGroupVariable = true;
public SelectionXYByGroupPanel(){
//create list filter and list model
unselectedVariableFilter = new VariableListFilter();
unselectedListModel = new VariableListModel(unselectedVariableFilter);
//create list filter and list model
selectedXVariableFilter = new VariableListFilter();
//create list filter and list model
selectedYVariableFilter = new VariableListFilter();
//create list filter and list model
groupByVariableFilter = new VariableListFilter();
initComponents();
}
/** 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() {
unselectedVariablePane = new JScrollPane();
unselectedVariableList = new JList();
unselectedVariableList.setName("unselectedVariableList");
unselectedVariableList.addFocusListener(new ListFocusListener());
unselectedVariableList.addFocusListener(new ListFocusListener());
xTextField = new JTextField();
xTextField.setName("selectedXVariableField");
xTextField.addFocusListener(new ListFocusListener());
xButton = new JButton();
button1 = new JButton();
button2 = new JButton();
button3 = new JButton();
button4 = new JButton();
yLabel = new JLabel();
yTextField = new JTextField();
yTextField.setName("selectedYVariableField");
yTextField.addFocusListener(new ListFocusListener());
yButton = new JButton();
xLabel = new JLabel();
groupByTextField = new JTextField();
groupByTextField.setName("groupVariableField");
groupByTextField.addFocusListener(new ListFocusListener());
groupButton = new JButton();
groupLabel = new JLabel();
setMinimumSize(new Dimension(414, 272));
setPreferredSize(new Dimension(414, 272));
unselectedVariablePane.setMinimumSize(new Dimension(125, 250));
unselectedVariablePane.setPreferredSize(new Dimension(125, 250));
unselectedVariableList.setModel(unselectedListModel);
unselectedVariableList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
unselectedVariablePane.setViewportView(unselectedVariableList);
xTextField.setMinimumSize(new Dimension(125, 28));
xTextField.setPreferredSize(new Dimension(125, 28));
xButton.setText(">");
xButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(selectXVariables){
//move selected variable to selectedList
int selected = unselectedVariableList.getSelectedIndex();
selectedXVariable = unselectedListModel.getElementAt(selected);
if(selectedXVariableFilter.passThroughFilter(selectedXVariable)){
xTextField.setText(selectedXVariable.getName().toString());
unselectedListModel.removeElement(selectedXVariable);
unselectedVariableList.clearSelection();
}else{
selectedXVariable = null;
}
}else{
//move selectedVariables to unselected list
if(selectedXVariable!=null){
unselectedListModel.addElement(selectedXVariable);
selectedXVariable=null;
xTextField.setText("");
}
}
}
});
// xButton.setMaximumSize(new Dimension(49, 25));
// xButton.setMinimumSize(new Dimension(49, 25));
// xButton.setPreferredSize(new Dimension(49, 25));
button1.setText("B1");
// button1.setMaximumSize(new Dimension(69, 25));
// button1.setMinimumSize(new Dimension(69, 25));
// button1.setPreferredSize(new Dimension(69, 25));
button2.setText("B2");
// button2.setMaximumSize(new Dimension(69, 25));
// button2.setMinimumSize(new Dimension(69, 25));
// button2.setPreferredSize(new Dimension(69, 25));
button3.setText("B3");
// button3.setMaximumSize(new Dimension(69, 25));
// button3.setMinimumSize(new Dimension(69, 25));
// button3.setPreferredSize(new Dimension(69, 25));
button4.setText("B4");
// button4.setMaximumSize(new Dimension(69, 25));
// button4.setMinimumSize(new Dimension(69, 25));
// button4.setPreferredSize(new Dimension(69, 25));
yLabel.setText(nameTextField2);
yTextField.setToolTipText("Grouping variable");
yTextField.setMinimumSize(new Dimension(125, 28));
yTextField.setPreferredSize(new Dimension(125, 28));
yButton.setText(">");
yButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(selectYVariables){
//move selected variable to selectedList
int selected = unselectedVariableList.getSelectedIndex();
selectedYVariable = unselectedListModel.getElementAt(selected);
if(selectedYVariableFilter.passThroughFilter(selectedYVariable)){
yTextField.setText(selectedYVariable.getName().toString());
unselectedListModel.removeElement(selectedYVariable);
unselectedVariableList.clearSelection();
}else{
selectedYVariable = null;
}
}else{
//move selectedVariables to unselected list
if(selectedYVariable!=null){
unselectedListModel.addElement(selectedYVariable);
selectedYVariable=null;
yTextField.setText("");
}
}
}
});
// yButton.setMaximumSize(new Dimension(49, 25));
// yButton.setMinimumSize(new Dimension(49, 25));
// yButton.setPreferredSize(new Dimension(49, 25));
xLabel.setText(nameTextField1);
groupByTextField.setMinimumSize(new Dimension(125, 28));
groupByTextField.setPreferredSize(new Dimension(125, 28));
groupButton.setText(">");
groupButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(selectGroupVariable){
//move selected variable to selectedList
int selected = unselectedVariableList.getSelectedIndex();
groupByVariable = unselectedListModel.getElementAt(selected);
if(groupByVariableFilter.passThroughFilter(groupByVariable)){
groupByTextField.setText(groupByVariable.getName().toString());
unselectedListModel.removeElement(groupByVariable);
unselectedVariableList.clearSelection();
}else{
groupByVariable = null;
}
}else{
//move selectedVariables to unselected list
if(groupByVariable!=null){
unselectedListModel.addElement(groupByVariable);
groupByVariable=null;
groupByTextField.setText("");
}
}
}
});
// groupButton.setMaximumSize(new Dimension(49, 25));
// groupButton.setMinimumSize(new Dimension(49, 25));
// groupButton.setPreferredSize(new Dimension(49, 25));
groupLabel.setText(nameGroupTextField);
GroupLayout layout = new GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(unselectedVariablePane, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING, false)
.addGroup(layout.createSequentialGroup()
.addComponent(xButton, GroupLayout.PREFERRED_SIZE, 50, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(xTextField, GroupLayout.PREFERRED_SIZE, 125, GroupLayout.PREFERRED_SIZE)
.addComponent(xLabel))
.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, 9, Short.MAX_VALUE)
.addComponent(button1, GroupLayout.DEFAULT_SIZE, 69, Short.MAX_VALUE))
.addGroup(GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(groupButton, GroupLayout.PREFERRED_SIZE, 50, GroupLayout.PREFERRED_SIZE)
.addComponent(yButton, GroupLayout.PREFERRED_SIZE, 50, GroupLayout.PREFERRED_SIZE))
.addGap(10, 10, 10)
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(groupByTextField, GroupLayout.PREFERRED_SIZE, 125, GroupLayout.PREFERRED_SIZE)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(yLabel, GroupLayout.PREFERRED_SIZE, 10, GroupLayout.PREFERRED_SIZE)
.addComponent(yTextField, GroupLayout.PREFERRED_SIZE, 125, GroupLayout.PREFERRED_SIZE))
.addGap(10, 10, 10)
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(button4, GroupLayout.DEFAULT_SIZE, 69, Short.MAX_VALUE)
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING)
.addComponent(button3, GroupLayout.DEFAULT_SIZE, 69, Short.MAX_VALUE)
.addComponent(button2, GroupLayout.DEFAULT_SIZE, 69, Short.MAX_VALUE))))
.addComponent(groupLabel))))
.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)
.addGroup(layout.createSequentialGroup()
.addGap(2, 2, 2)
.addComponent(button1, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addGap(2, 2, 2)
.addComponent(button2, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addGap(2, 2, 2)
.addComponent(button3, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addGap(2, 2, 2)
.addComponent(button4, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
.addComponent(unselectedVariablePane, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
.addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGroup(layout.createSequentialGroup()
.addComponent(xLabel)
.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
.addComponent(xButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addComponent(xTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
.addGap(18, 18, 18)
.addComponent(yLabel)
.addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
.addComponent(yTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addComponent(yButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, 64, Short.MAX_VALUE)
.addComponent(groupLabel)
.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(groupButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addComponent(groupByTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
.addGap(30, 30, 30))))
);
}// </editor-fold>
public void setVariables(ArrayList<VariableAttributes> variables){
reset();
unselectedListModel.clear();
for(VariableAttributes v : variables){
unselectedListModel.addElement(v);
}
}
public void reset(){
if(selectedXVariable!=null){
unselectedListModel.addElement(selectedXVariable);
selectedXVariable = null;
}
xTextField.setText("");
xButton.setEnabled(true);
if(selectedYVariable!=null){
unselectedListModel.addElement(selectedYVariable);
selectedYVariable = null;
}
yTextField.setText("");
yButton.setEnabled(true);
if(groupByVariable!=null){
unselectedListModel.addElement(groupByVariable);
groupByVariable = null;
}
groupByTextField.setText("");
groupButton.setEnabled(true);
}
public void addUnselectedFilterDataType(DataType dataType){
unselectedVariableFilter.addFilteredDataType(dataType);
}
public void addUnselectedFilterItemType(ItemType itemType){
unselectedVariableFilter.addFilteredItemType(itemType);
}
public void addUnselectedFilterItemType(DataType dataType, ItemType itemType){
unselectedVariableFilter.addFilteredDataType(dataType);
unselectedVariableFilter.addFilteredItemType(itemType);
}
public void addSelectedXFilterDataType(DataType dataType){
selectedXVariableFilter.addFilteredDataType(dataType);
}
public void addSelectedXFilterItemType(ItemType itemType){
selectedXVariableFilter.addFilteredItemType(itemType);
}
public void addSelectedXFilterType(DataType dataType, ItemType itemType){
selectedXVariableFilter.addFilteredDataType(dataType);
selectedXVariableFilter.addFilteredItemType(itemType);
}
public void addSelectedYFilterDataType(DataType dataType){
selectedYVariableFilter.addFilteredDataType(dataType);
}
public void addSelectedYFilterItemType(ItemType itemType){
selectedYVariableFilter.addFilteredItemType(itemType);
}
public void addSelectedYFilterType(DataType dataType, ItemType itemType){
selectedYVariableFilter.addFilteredDataType(dataType);
selectedYVariableFilter.addFilteredItemType(itemType);
}
public void addGroupByFilterDataType(DataType dataType){
groupByVariableFilter.addFilteredDataType(dataType);
}
public void addGroupByFilterItemType(ItemType itemType){
groupByVariableFilter.addFilteredItemType(itemType);
}
public void addGroupByFilterType(DataType dataType, ItemType itemType){
groupByVariableFilter.addFilteredDataType(dataType);
groupByVariableFilter.addFilteredItemType(itemType);
}
public JButton getButton1(){
return button1;
}
public JButton getButton2(){
return button2;
}
public JButton getButton3(){
return button3;
}
public JButton getButton4(){
return button4;
}
public void showButton1(boolean show){
button1.setVisible(show);
}
public void showButton2(boolean show){
button2.setVisible(show);
}
public void showButton3(boolean show){
button3.setVisible(show);
}
public void showButton4(boolean show){
button4.setVisible(show);
}
public boolean selectionMade(){
int sum = 0;
if(selectedXVariable!=null) sum++;
if(selectedYVariable!=null) sum++;
return sum==2;
}
public void setNameTextField1(String nameTextField1){
this.nameTextField1 = nameTextField1;
}
public void setNameTextField2(String nameTextField2){
this.nameTextField2 = nameTextField2;
}
public void setNameGroupTextField(String nameGroupTextField){
this.nameGroupTextField = nameGroupTextField;
}
/**
*
* @return array of selected variables.
*/
public VariableAttributes getSelectedXVariable(){
return selectedXVariable;
}
public VariableAttributes getSelectedYVariable(){
return selectedYVariable;
}
public boolean hasGroupingVariable(){
return groupByVariable!=null;
}
public VariableAttributes getGroupByVariable(){
return groupByVariable;
}
public VariableChangeListener getVariableChangedListener(){
return this;
}
public void variableChanged(VariableChangeEvent e){
if(e.getChangeType()== VariableChangeType.VARIABLE_DELETED){
VariableAttributes varAttr = e.getVariable();
unselectedListModel.removeElement(varAttr);
if(selectedXVariable!=null && selectedXVariable.equals(varAttr)){
selectedXVariable=null;
xTextField.setText("");
}
if(selectedYVariable!=null && selectedYVariable.equals(varAttr)){
selectedYVariable=null;
yTextField.setText("");
}
if(groupByVariable!=null && groupByVariable.equals(varAttr)){
groupByVariable=null;
groupByTextField.setText("");
}
}else if(e.getChangeType()==VariableChangeType.VARIABLE_ADDED){
VariableAttributes varAttr = e.getVariable();
unselectedListModel.addElement(varAttr);
}else if(e.getChangeType()==VariableChangeType.VARIABLE_MODIFIED){
VariableAttributes varAttr = e.getVariable();
//do not use selectedListModel.replaceElement(v) because of need to filter variable
if(selectedXVariable!=null && selectedXVariable.equals(varAttr)){
if(selectedXVariableFilter.passThroughFilter(selectedXVariable)){
selectedXVariable=varAttr;
xTextField.setText(selectedXVariable.getName().toString());
}else{
unselectedListModel.addElement(varAttr);//force filtering
selectedXVariable = null;
xTextField.setText("");
}
}else if(selectedYVariable!=null && selectedYVariable.equals(varAttr)){
if(selectedYVariableFilter.passThroughFilter(selectedYVariable)){
selectedYVariable=varAttr;
yTextField.setText(selectedYVariable.getName().toString());
}else{
unselectedListModel.addElement(varAttr);//force filtering
selectedYVariable = null;
yTextField.setText("");
}
}else if(groupByVariable!=null && groupByVariable.equals(varAttr)){
if(groupByVariableFilter.passThroughFilter(groupByVariable)){
groupByVariable=varAttr;
groupByTextField.setText(groupByVariable.getName().toString());
}else{
unselectedListModel.addElement(varAttr);//force filtering
groupByVariable = null;
groupByTextField.setText("");
}
}else{
if(unselectedListModel.contains(varAttr)){
//do not use variableListModel.replaceElement(v) because of need to filter variable
unselectedListModel.removeElement(varAttr);
unselectedListModel.addElement(varAttr); //will force filtering of modified variable
}
}
}else if(e.getChangeType()==VariableChangeType.VARIABLE_RENAMED){
VariableAttributes oldVariable = e.getOldVariable();
//do not use selectedListModel.replaceElement(v) because of need to filter variable
if(selectedXVariable!=null && selectedXVariable.equals(oldVariable)){
if(selectedXVariableFilter.passThroughFilter(selectedXVariable)){
selectedXVariable=e.getVariable();
xTextField.setText(selectedXVariable.getName().toString());
}else{
unselectedListModel.addElement(e.getVariable());//force filtering
selectedXVariable = null;
xTextField.setText("");
}
}else if(selectedYVariable!=null && selectedYVariable.equals(oldVariable)){
if(selectedYVariableFilter.passThroughFilter(selectedYVariable)){
selectedYVariable=e.getVariable();
yTextField.setText(selectedYVariable.getName().toString());
}else{
unselectedListModel.addElement(e.getVariable());//force filtering
selectedYVariable = null;
yTextField.setText("");
}
}else if(groupByVariable!=null && groupByVariable.equals(oldVariable)){
if(groupByVariableFilter.passThroughFilter(groupByVariable)){
groupByVariable=e.getVariable();
groupByTextField.setText(groupByVariable.getName().toString());
}else{
unselectedListModel.addElement(e.getVariable());//force filtering
groupByVariable = null;
groupByTextField.setText("");
}
}else{
if(unselectedListModel.contains(oldVariable)){
//do not use variableListModel.replaceElement(v) because of need to filter variable
unselectedListModel.removeElement(oldVariable);
unselectedListModel.addElement(e.getVariable()); //will force filtering of modified variable
}
}
}
}
public void setUnselectedListCellRenderer(DefaultListCellRenderer renderer){
unselectedVariableList.setCellRenderer(renderer);
}
public class ListFocusListener implements FocusListener {
public void focusGained(FocusEvent e){
String compName = e.getComponent().getName();
if(compName!=null){
if("unselectedVariableList".equals(compName)){
if(selectedXVariable!=null) xButton.setEnabled(false);
if(selectedYVariable!=null) yButton.setEnabled(false);
if(groupByVariable!=null) groupButton.setEnabled(false);
xButton.setText(">");
xButton.setToolTipText("Select variable");
selectXVariables = true;
yButton.setText(">");
yButton.setToolTipText("Select variable");
selectYVariables = true;
groupButton.setText(">");
groupButton.setToolTipText("Select group variable");
selectGroupVariable = true;
}
if("selectedXVariableField".equals(compName)){
xButton.setEnabled(true);
xButton.setText("<");
xButton.setToolTipText("Deselect variable");
xTextField.selectAll();
selectXVariables = false;
}
if("selectedYVariableField".equals(compName)){
yButton.setEnabled(true);
yButton.setText("<");
yButton.setToolTipText("Deselect variable");
yTextField.selectAll();
selectYVariables = false;
}
if("groupVariableField".equals(compName)){
groupButton.setEnabled(true);
groupButton.setText("<");
groupButton.setToolTipText("Deselect group variable");
groupByTextField.selectAll();
selectGroupVariable = false;
}
}
}
public void focusLost(FocusEvent e){
//do nothing
}
}
}