/*
* 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 MultipleSelectionXYByGroupPanel extends JPanel implements VariableChangeListener{
// Variables declaration - do not modify
private JButton button1;
private JButton button2;
private JButton button3;
private JButton button4;
private JButton selectedGroupButton;
private JTextField groupByTextField;
private JLabel groupbyLabel;
private JButton independentVariableButton;
private JLabel independentVariableLabel;
private JTextField independentVariableTextField;
private JButton selectAllButton;
private JButton selectButton;
private JList selectedVariableList;
private JScrollPane selectedVariableScrollPane;
private JList unselectedVariableList;
private JScrollPane variableScrollPane;
// End of variables declaration
private VariableListModel unselectedListModel;
private VariableListModel selectedListModel;
private VariableListFilter unselectedVariableFilter;
private VariableListFilter selectedVariableFilter;
private VariableListFilter groupByVariableFilter;
private VariableListFilter independentVariableFilter;
private VariableAttributes groupByVariable;
private VariableAttributes independentVariable;
private boolean selectVariables = true;
private boolean selectGroupVariable = true;
private boolean selectIndependentVariable = true;
public MultipleSelectionXYByGroupPanel(){
//create list filter and list model
unselectedVariableFilter = new VariableListFilter();
unselectedListModel = new VariableListModel(unselectedVariableFilter);
//create list filter and list model
selectedVariableFilter = new VariableListFilter();
selectedListModel = new VariableListModel(selectedVariableFilter);
//create list filter
groupByVariableFilter = new VariableListFilter();
//create list filter
independentVariableFilter = new VariableListFilter();
initComponents();
}
private void initComponents() {
selectButton = new JButton();
selectAllButton = new JButton();
selectedVariableScrollPane = new JScrollPane();
selectedVariableList = new JList();
selectedVariableList.setName("selectedVariableList");
selectedVariableList.addFocusListener(new ListFocusListener());
variableScrollPane = new JScrollPane();
unselectedVariableList = new JList();
unselectedVariableList.setName("unselectedVariableList");
unselectedVariableList.addFocusListener(new ListFocusListener());
button1 = new JButton();
button2 = new JButton();
button3 = new JButton();
button4 = new JButton();
independentVariableLabel = new JLabel();
independentVariableTextField = new JTextField();
independentVariableTextField.setName("independentVariableField");
independentVariableTextField.addFocusListener(new ListFocusListener());
independentVariableButton = new JButton();
groupbyLabel = new JLabel();
groupByTextField = new JTextField();
groupByTextField.setName("groupVariableField");
groupByTextField.addFocusListener(new ListFocusListener());
selectedGroupButton = new JButton();
setMinimumSize(new Dimension(414, 272));
setPreferredSize(new Dimension(412, 272));
selectButton.setText(">");
selectButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(selectVariables){
//move selected variable to selectedList
int[] selected = unselectedVariableList.getSelectedIndices();
for(int i=0;i<selected.length;i++){
selectedListModel.addElement(unselectedListModel.getElementAt(selected[i]));
}
for(int i=0;i<selectedListModel.getSize();i++){
unselectedListModel.removeElement(selectedListModel.getElementAt(i));
}
unselectedVariableList.clearSelection();
}else{
//move selectedVariables to unselected list
int[] selected = selectedVariableList.getSelectedIndices();
for(int i=0;i<selected.length;i++){
unselectedListModel.addElement(selectedListModel.getElementAt(selected[i]));
}
for(int i=0; i <unselectedListModel.getSize();i++){
selectedListModel.removeElement(unselectedListModel.getElementAt(i));
}
selectedVariableList.clearSelection();
}
}
});
selectButton.setMaximumSize(new Dimension(49, 28));
selectButton.setMinimumSize(new Dimension(49, 28));
selectButton.setPreferredSize(new Dimension(49, 28));
selectAllButton.setText(">>");
selectAllButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(selectVariables){
//move all variables to selectedList
selectedListModel.addAll(unselectedListModel.getAll());
unselectedListModel.removeAll(selectedListModel.getAll());
}else{
//move all variables to unselected list
unselectedListModel.addAll(selectedListModel.getAll());
selectedListModel.removeAll(unselectedListModel.getAll());
}
}
});
selectAllButton.setMaximumSize(new Dimension(49, 28));
selectAllButton.setMinimumSize(new Dimension(49, 28));
selectAllButton.setPreferredSize(new Dimension(49, 28));
selectedVariableScrollPane.setMinimumSize(new Dimension(125, 260));
selectedVariableScrollPane.setPreferredSize(new Dimension(125, 250));
selectedVariableList.setModel(selectedListModel);
selectedVariableScrollPane.setViewportView(selectedVariableList);
variableScrollPane.setMinimumSize(new Dimension(125, 250));
variableScrollPane.setPreferredSize(new Dimension(125, 250));
unselectedVariableList.setModel(unselectedListModel);
variableScrollPane.setViewportView(unselectedVariableList);
button1.setText("B1");
button1.setMaximumSize(new Dimension(72, 28));
button1.setMinimumSize(new Dimension(72, 28));
button1.setPreferredSize(new Dimension(72, 28));
button2.setText("B2");
button2.setMaximumSize(new Dimension(72, 28));
button2.setMinimumSize(new Dimension(72, 28));
button2.setPreferredSize(new Dimension(72, 28));
button3.setText("B3");
button3.setMaximumSize(new Dimension(72, 28));
button3.setMinimumSize(new Dimension(72, 28));
button3.setPreferredSize(new Dimension(72, 28));
button4.setText("B4");
button4.setMaximumSize(new Dimension(72, 28));
button4.setMinimumSize(new Dimension(72, 28));
button4.setPreferredSize(new Dimension(72, 28));
independentVariableLabel.setText("Independent Variable");
independentVariableTextField.setMaximumSize(new Dimension(125, 28));
independentVariableTextField.setMinimumSize(new Dimension(125, 28));
independentVariableTextField.setPreferredSize(new Dimension(128, 28));
independentVariableButton.setText(">");
independentVariableButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(selectIndependentVariable){
//Check to see if variable passes filter. If so, then move it to selected list
int[] selected = unselectedVariableList.getSelectedIndices();
VariableAttributes temp = unselectedListModel.getElementAt(selected[0]);//only use first selection
if(independentVariableFilter.passThroughFilter(temp)){
independentVariable = temp;
unselectedListModel.removeElement(independentVariable);
unselectedVariableList.clearSelection();
independentVariableTextField.setText(independentVariable.getName().toString());
}else{
temp = null;
independentVariable = null;
}
}else{
//move selectedVariables to unselected list
if(independentVariable!=null){
unselectedListModel.addElement(independentVariable);
independentVariable = null;
independentVariableTextField.setText("");
}
}
}
});
independentVariableButton.setMaximumSize(new Dimension(49, 28));
independentVariableButton.setMinimumSize(new Dimension(49, 28));
independentVariableButton.setPreferredSize(new Dimension(49, 28));
groupbyLabel.setText("Group by");
groupByTextField.setMaximumSize(new Dimension(125, 28));
groupByTextField.setMinimumSize(new Dimension(125, 28));
groupByTextField.setPreferredSize(new Dimension(128, 28));
selectedGroupButton.setText(">");
selectedGroupButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(selectGroupVariable){
//Check to see if variable passes filter. If so, then move it to selected list
int[] selected = unselectedVariableList.getSelectedIndices();
VariableAttributes temp = unselectedListModel.getElementAt(selected[0]);//only use first selection
if(groupByVariableFilter.passThroughFilter(temp)){
groupByVariable = temp;
unselectedListModel.removeElement(groupByVariable);
unselectedVariableList.clearSelection();
groupByTextField.setText(groupByVariable.getName().toString());
}else{
temp = null;
groupByVariable = null;
}
}else{
//move selectedVariables to unselected list
if(groupByVariable!=null){
unselectedListModel.addElement(groupByVariable);
groupByVariable = null;
groupByTextField.setText("");
}
}
}
});
selectedGroupButton.setMaximumSize(new Dimension(49, 28));
selectedGroupButton.setMinimumSize(new Dimension(49, 28));
selectedGroupButton.setPreferredSize(new Dimension(49, 28));
GroupLayout layout = new GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(variableScrollPane, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING)
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(independentVariableButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addComponent(selectButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
.addComponent(selectAllButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addComponent(selectedGroupButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(independentVariableLabel)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING, false)
.addComponent(independentVariableTextField, GroupLayout.Alignment.LEADING, 0, 0, Short.MAX_VALUE)
.addComponent(selectedVariableScrollPane, GroupLayout.Alignment.LEADING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING, false)
.addComponent(button4, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(button1, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(button3, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(button2, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
.addComponent(groupbyLabel)
.addComponent(groupByTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
.addContainerGap(13, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(variableScrollPane, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING, false)
.addComponent(selectedVariableScrollPane, GroupLayout.Alignment.LEADING, 0, 0, Short.MAX_VALUE)
.addGroup(GroupLayout.Alignment.LEADING, 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)))
.addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(independentVariableLabel))
.addGroup(layout.createSequentialGroup()
.addGap(7, 7, 7)
.addComponent(selectButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
.addComponent(selectAllButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)))
.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(independentVariableButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addComponent(independentVariableTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
.addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(groupbyLabel)
.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
.addComponent(groupByTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addComponent(selectedGroupButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))))
.addContainerGap())
);
}// </editor-fold>
public void setVariables(ArrayList<VariableAttributes> variables){
reset();
unselectedListModel.clear();
for(VariableAttributes v : variables){
unselectedListModel.addElement(v);
}
}
public void reset(){
unselectedListModel.addAll(selectedListModel.getAll());
selectedListModel.clear();
if(groupByVariable!=null){
unselectedListModel.addElement(groupByVariable);
groupByVariable = null;
}
groupByTextField.setText("");
selectedGroupButton.setEnabled(true);
if(independentVariable!=null){
unselectedListModel.addElement(independentVariable);
independentVariable = null;
}
independentVariableTextField.setText("");
independentVariableButton.setEnabled(true);
}
public void addUnselectedFilterDataType(DataType dataType){
unselectedVariableFilter.addFilteredDataType(dataType);
}
public void addSelectedFilterDataType(DataType dataType){
selectedVariableFilter.addFilteredDataType(dataType);
}
public void addGroupByFilterDataType(DataType dataType){
groupByVariableFilter.addFilteredDataType(dataType);
}
public void addUnselectedFilterItemType(ItemType itemType){
unselectedVariableFilter.addFilteredItemType(itemType);
}
public void addSelectedFilterItemType(ItemType itemType){
selectedVariableFilter.addFilteredItemType(itemType);
}
public void addGroupByFilterItemType(ItemType itemType){
groupByVariableFilter.addFilteredItemType(itemType);
}
public void addUnselectedFilterType(DataType dataType, ItemType itemType){
unselectedVariableFilter.addFilteredDataType(dataType);
unselectedVariableFilter.addFilteredItemType(itemType);
}
public void addSelectedFilterType(DataType dataType, ItemType itemType){
selectedVariableFilter.addFilteredDataType(dataType);
selectedVariableFilter.addFilteredItemType(itemType);
}
public void addGroupByFilterType(DataType dataType, ItemType itemType){
groupByVariableFilter.addFilteredDataType(dataType);
groupByVariableFilter.addFilteredItemType(itemType);
}
public void addIndependentVariableFilterDataType(DataType dataType){
independentVariableFilter.addFilteredDataType(dataType);
}
public void addIndependentVariableFilterItemType(ItemType itemType){
independentVariableFilter.addFilteredItemType(itemType);
}
public void addIndependentVariableFilterType(DataType dataType, ItemType itemType){
independentVariableFilter.addFilteredDataType(dataType);
independentVariableFilter.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(){
return selectedListModel.getSize()>0;
}
public boolean hasIndependentVariable(){
return independentVariable!=null;
}
/**
*
* @return array of selected variables.
*/
public VariableAttributes[] getSelectedVariables(){
VariableAttributes[] selected = selectedListModel.getAll();
return selected;
}
public VariableAttributes getGroupByVariable(){
return groupByVariable;
}
public VariableAttributes getIndependentVariable(){
return independentVariable;
}
public boolean hasGroupingVariable(){
return groupByVariable!=null;
}
public VariableChangeListener getVariableChangedListener(){
return this;
}
public void variableChanged(VariableChangeEvent e){
if(e.getChangeType()== VariableChangeType.VARIABLE_DELETED){
VariableAttributes varAttr = e.getVariable();
unselectedListModel.removeElement(varAttr);
selectedListModel.removeElement(varAttr);
if(groupByVariable!=null && groupByVariable.equals(varAttr)){
groupByVariable=null;
}
}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(selectedListModel.removeElement(varAttr)){
selectedListModel.addElement(varAttr); //will force filtering of modified variable
}else if(unselectedListModel.removeElement(varAttr)){
//do not use variableListModel.replaceElement(v) because of need to filter variable
unselectedListModel.addElement(varAttr); //will force filtering of modified variable
}else if(independentVariable.equals(varAttr)){
if(independentVariableFilter.passThroughFilter(independentVariable)){
independentVariable=varAttr;
}else{
unselectedListModel.addElement(varAttr);//force filtering
}
}else if(groupByVariable.equals(varAttr)){
if(groupByVariableFilter.passThroughFilter(groupByVariable)){
groupByVariable=varAttr;
}else{
unselectedListModel.addElement(varAttr);//force filtering
}
}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(selectedListModel.removeElement(oldVariable)){
selectedListModel.addElement(e.getVariable()); //will force filtering of modified variable
}else if(unselectedListModel.removeElement(oldVariable)){
//do not use variableListModel.replaceElement(v) because of need to filter variable
unselectedListModel.addElement(e.getVariable()); //will force filtering of modified variable
}else if(independentVariable.equals(oldVariable)){
if(independentVariableFilter.passThroughFilter(independentVariable)){
independentVariable=e.getVariable();
}else{
unselectedListModel.addElement(e.getVariable());//force filtering
}
}else if(groupByVariable.equals(oldVariable)){
if(groupByVariableFilter.passThroughFilter(groupByVariable)){
groupByVariable=e.getVariable();
}else{
unselectedListModel.addElement(e.getVariable());//force filtering
}
}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 void setSelectedVariableListCellRenderer(DefaultListCellRenderer renderer){
selectedVariableList.setCellRenderer(renderer);
}
public void repaintLists(){
unselectedVariableList.repaint();
selectedVariableList.repaint();
}
public void setIndependentVariableLabel(String text){
independentVariableLabel.setText(text);
}
public class ListFocusListener implements FocusListener {
public void focusGained(FocusEvent e){
String compName = e.getComponent().getName();
if(compName!=null){
if("unselectedVariableList".equals(compName)){
if(groupByVariable!=null) selectedGroupButton.setEnabled(false);
if(independentVariable!=null) independentVariableButton.setEnabled(false);
selectButton.setText(">");
selectButton.setToolTipText("Select variable");
selectAllButton.setText(">>");
selectAllButton.setToolTipText("Select all variables");
selectVariables = true;
selectedGroupButton.setText(">");
selectedGroupButton.setToolTipText("Select group variable");
selectGroupVariable = true;
independentVariableButton.setText(">");
independentVariableButton.setToolTipText("Select group variable");
selectIndependentVariable = true;
}
if("selectedVariableList".equals(compName)){
selectButton.setText("<");
selectButton.setToolTipText("Deselect variable");
selectAllButton.setText("<<");
selectAllButton.setToolTipText("Deselect all variables");
selectVariables = false;
}
if("groupVariableField".equals(compName)){
selectedGroupButton.setEnabled(true);
selectedGroupButton.setText("<");
selectedGroupButton.setToolTipText("Deselect group variable");
groupByTextField.selectAll();
selectGroupVariable = false;
}
if("independentVariableField".equals(compName)){
independentVariableButton.setEnabled(true);
independentVariableButton.setText("<");
independentVariableButton.setToolTipText("Deselect group variable");
independentVariableTextField.selectAll();
selectIndependentVariable = false;
}
}
}
public void focusLost(FocusEvent e){
//do nothing
}
}
}