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