/* * 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 SingleSelectionByGroupPanel extends JPanel implements VariableChangeListener { // Variables declaration - do not modify private JButton button1; private JButton groupButton; private JButton button2; private JButton button3; private JButton button4; private JLabel groupByLabel; private JList unselectedVariableList; private JTextField selectedVariableField; private JTextField groupByTextField; private JButton selectButton; private JScrollPane unselectedVariablePane; private VariableListModel unselectedListModel; private VariableListFilter unselectedVariableFilter; private VariableListFilter selectedVariableFilter; private VariableListFilter groupByVariableFilter; private VariableAttributes selectedVariable; private VariableAttributes groupByVariable; /** * If true, variables moved from unselectedVariableList to selectedList. * If false, variables moved from selectedList to unselectedVariableList. */ private boolean selectVariables = true; private boolean selectGroupVariable = true; // End of variables declaration /** Creates new form SingleSelectionPanel */ public SingleSelectionByGroupPanel() { //create list filter and list model unselectedVariableFilter = new VariableListFilter(); unselectedListModel = new VariableListModel(unselectedVariableFilter); //create list filter and list model selectedVariableFilter = 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()); selectedVariableField = new JTextField(); selectedVariableField.setName("selectedVariableField"); selectedVariableField.addFocusListener(new ListFocusListener()); selectButton = new JButton(); button1 = new JButton(); button2 = new JButton(); button3 = new JButton(); button4 = new JButton(); groupByLabel = new JLabel(); groupByTextField = new JTextField(); groupByTextField.setName("groupVariableField"); groupByTextField.addFocusListener(new ListFocusListener()); groupButton = new JButton(); setMinimumSize(new Dimension(400, 272)); setPreferredSize(new Dimension(400, 272)); unselectedVariablePane.setMinimumSize(new Dimension(125, 250)); unselectedVariablePane.setPreferredSize(new Dimension(125, 250)); unselectedVariableList.setModel(unselectedListModel); unselectedVariableList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); unselectedVariablePane.setViewportView(unselectedVariableList); selectedVariableField.setMinimumSize(new Dimension(125, 28)); selectedVariableField.setPreferredSize(new Dimension(125, 28)); selectButton.setText(">"); selectButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if(selectVariables){ //move selected variable to selectedList int selected = unselectedVariableList.getSelectedIndex(); selectedVariable = unselectedListModel.getElementAt(selected); if(selectedVariableFilter.passThroughFilter(selectedVariable)){ selectedVariableField.setText(selectedVariable.getName().toString()); unselectedListModel.removeElement(selectedVariable); unselectedVariableList.clearSelection(); }else{ selectedVariable = null; } }else{ //move selectedVariables to unselected list if(selectedVariable!=null){ unselectedListModel.addElement(selectedVariable); selectedVariable=null; selectedVariableField.setText(""); } } } }); // selectButton.setMaximumSize(new Dimension(49, 25)); // selectButton.setMinimumSize(new Dimension(49, 25)); // selectButton.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)); groupByLabel.setText("Group by:"); groupByTextField.setToolTipText("Grouping variable"); groupByTextField.setMinimumSize(new Dimension(125, 28)); groupByTextField.setPreferredSize(new Dimension(125, 28)); groupButton.setText(">"); groupButton.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.getSelectedIndex(); VariableAttributes temp = unselectedListModel.getElementAt(selected); 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(""); } } } }); // groupButton.setMaximumSize(new Dimension(49, 25)); // groupButton.setMinimumSize(new Dimension(49, 25)); // groupButton.setPreferredSize(new Dimension(49, 25)); 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) .addComponent(selectButton, GroupLayout.PREFERRED_SIZE, 50, GroupLayout.PREFERRED_SIZE) .addComponent(groupButton, GroupLayout.PREFERRED_SIZE, 50, GroupLayout.PREFERRED_SIZE)) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(selectedVariableField, GroupLayout.PREFERRED_SIZE, 125, GroupLayout.PREFERRED_SIZE) .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addComponent(button2, GroupLayout.DEFAULT_SIZE, 69, Short.MAX_VALUE) .addComponent(button1, GroupLayout.DEFAULT_SIZE, 69, Short.MAX_VALUE) .addComponent(button3, GroupLayout.DEFAULT_SIZE, 69, Short.MAX_VALUE) .addComponent(button4, GroupLayout.DEFAULT_SIZE, 69, Short.MAX_VALUE))) .addComponent(groupByLabel) .addComponent(groupByTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) .addGap(16, 16, 16)) ); 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.TRAILING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(selectButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(selectedVariableField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) .addGap(2, 2, 2)) .addGroup(layout.createSequentialGroup() .addComponent(button1, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addGap(2, 2, 2))) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .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) .addGap(64, 64, 64) .addComponent(groupByLabel) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(groupByTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(groupButton, 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)) ); }// </editor-fold> public void setVariables(ArrayList<VariableAttributes> variables){ reset(); unselectedListModel.clear(); for(VariableAttributes v : variables){ unselectedListModel.addElement(v); } } public void reset(){ if(selectedVariable!=null){ unselectedListModel.addElement(selectedVariable); selectedVariable = null; } selectedVariableField.setText(""); if(groupByVariable!=null){ unselectedListModel.addElement(groupByVariable); groupByVariable = null; } groupByTextField.setText(""); selectButton.setEnabled(true); groupButton.setEnabled(true); } public void addUnselectedFilterDataType(DataType dataType){ unselectedVariableFilter.addFilteredDataType(dataType); } public void addUnselectedFilterItemType(ItemType itemType){ unselectedVariableFilter.addFilteredItemType(itemType); } public void addUnselectedFilterType(DataType dataType, ItemType itemType){ unselectedVariableFilter.addFilteredDataType(dataType); unselectedVariableFilter.addFilteredItemType(itemType); } public void addSelectedFilterDataType(DataType dataType){ selectedVariableFilter.addFilteredDataType(dataType); } public void addSelectedFilterItemType(ItemType itemType){ selectedVariableFilter.addFilteredItemType(itemType); } public void addSelectedFilterType(DataType dataType, ItemType itemType){ selectedVariableFilter.addFilteredDataType(dataType); selectedVariableFilter.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(){ if(selectedVariable==null) return false; return true; } /** * * @return array of selected variables. */ public VariableAttributes getSelectedVariable(){ return selectedVariable; } 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(selectedVariable!=null && selectedVariable.equals(varAttr)){ selectedVariable=null; selectedVariableField.setText(""); }else 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(selectedVariable!=null && selectedVariable.equals(varAttr)){ if(selectedVariableFilter.passThroughFilter(selectedVariable)){ selectedVariable=varAttr; selectedVariableField.setText(selectedVariable.getName().toString()); }else{ unselectedListModel.addElement(varAttr);//force filtering selectedVariable = null; selectedVariableField.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(selectedVariable!=null && selectedVariable.equals(oldVariable)){ if(selectedVariableFilter.passThroughFilter(selectedVariable)){ selectedVariable=e.getVariable(); selectedVariableField.setText(selectedVariable.getName().toString()); }else{ unselectedListModel.addElement(e.getVariable());//force filtering selectedVariable = null; selectedVariableField.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(selectedVariable!=null) selectButton.setEnabled(false); if(groupByVariable!=null) groupButton.setEnabled(false); selectButton.setText(">"); selectButton.setToolTipText("Select variable"); selectVariables = true; groupButton.setText(">"); groupButton.setToolTipText("Select group variable"); selectGroupVariable = true; } if("selectedVariableField".equals(compName)){ selectButton.setEnabled(true); selectButton.setText("<"); selectButton.setToolTipText("Deselect variable"); selectedVariableField.selectAll(); selectVariables = 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 } } }