/* * 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 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; import javax.swing.*; public class MultipleSelectionByGroupPanel extends JPanel implements VariableChangeListener{ // Variables declaration - do not modify private JButton button1; private JButton button2; private JButton button3; private JButton button4; private JTextField groupByTextField; private JLabel groupLabel; private JScrollPane jScrollPane1; private JButton selectAllButton; private JButton selectButton; private JButton selectedGroupButton; private JList selectedVariableList; private JScrollPane selectedVariableScrollPane; private JList unselectedVariableList; private VariableListModel unselectedListModel; private VariableListModel selectedListModel; private VariableListFilter unselectedVariableFilter; private VariableListFilter selectedVariableFilter; private VariableListFilter groupByVariableFilter; private VariableAttributes groupByVariable; private String nameGroupTextField = "Group by:"; /** * If true, variables moved from unselectedVariableList to selectedList. * If false, variables moved from selectedList to unselectedVariableList. */ private boolean selectVariables = true; private boolean selectGroupVariable = true; /** Creates new form MultipleSelectionByGroupPanel */ public MultipleSelectionByGroupPanel() { //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 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() { jScrollPane1 = new JScrollPane(); unselectedVariableList = new JList(); unselectedVariableList.setName("unselectedVariableList"); unselectedVariableList.addFocusListener(new ListFocusListener()); selectButton = new JButton(); selectAllButton = new JButton(); selectedVariableScrollPane = new JScrollPane(); selectedVariableList = new JList(); selectedVariableList.setName("selectedVariableList"); selectedVariableList.addFocusListener(new ListFocusListener()); groupLabel = new JLabel(); groupByTextField = new JTextField(); groupByTextField.setName("groupVariableField"); groupByTextField.addFocusListener(new ListFocusListener()); selectedGroupButton = new JButton(); button1 = new JButton(); button2 = new JButton(); button3 = new JButton(); button4 = new JButton(); setMinimumSize(new Dimension(414, 272)); setPreferredSize(new Dimension(414, 272)); jScrollPane1.setMinimumSize(new Dimension(125, 250)); jScrollPane1.setPreferredSize(new Dimension(125, 250)); unselectedVariableList.setModel(unselectedListModel); jScrollPane1.setViewportView(unselectedVariableList); 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, 25)); // selectButton.setMinimumSize(new Dimension(49, 25)); // selectButton.setPreferredSize(new Dimension(49, 25)); 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, 25)); // selectAllButton.setMinimumSize(new Dimension(49, 25)); // selectAllButton.setPreferredSize(new Dimension(49, 25)); selectedVariableScrollPane.setMinimumSize(new Dimension(125, 175)); selectedVariableScrollPane.setPreferredSize(new Dimension(125, 175)); selectedVariableList.setModel(selectedListModel); selectedVariableScrollPane.setViewportView(selectedVariableList); groupLabel.setText(nameGroupTextField); groupByTextField.setMinimumSize(new Dimension(125, 28)); groupByTextField.setPreferredSize(new Dimension(125, 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, 25)); // selectedGroupButton.setMinimumSize(new Dimension(49, 25)); // selectedGroupButton.setPreferredSize(new Dimension(49, 25)); button1.setText("B1"); // button1.setMaximumSize(new Dimension(70, 25)); // button1.setMinimumSize(new Dimension(70, 25)); // button1.setPreferredSize(new Dimension(70, 25)); button2.setText("B2"); // button2.setMaximumSize(new Dimension(70, 25)); // button2.setMinimumSize(new Dimension(70, 25)); // button2.setPreferredSize(new Dimension(70, 25)); button3.setText("B3"); // button3.setMaximumSize(new Dimension(70, 25)); // button3.setMinimumSize(new Dimension(70, 25)); // button3.setPreferredSize(new Dimension(70, 25)); button4.setText("B4"); // button4.setMaximumSize(new Dimension(70, 25)); // button4.setMinimumSize(new Dimension(70, 25)); // button4.setPreferredSize(new Dimension(70, 25)); GroupLayout layout = new GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(jScrollPane1, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING, false) .addComponent(selectedGroupButton, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, 49) .addComponent(selectButton, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, 49) .addComponent(selectAllButton, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, 49)) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING, false) .addComponent(groupByTextField, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(groupLabel) .addComponent(selectedVariableScrollPane, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addComponent(button3, GroupLayout.DEFAULT_SIZE, 69, Short.MAX_VALUE) .addComponent(button4, GroupLayout.DEFAULT_SIZE, 69, Short.MAX_VALUE) .addComponent(button2, GroupLayout.DEFAULT_SIZE, 69, Short.MAX_VALUE) .addComponent(button1, GroupLayout.DEFAULT_SIZE, 69, Short.MAX_VALUE)) .addContainerGap(13, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(56, 56, 56) .addComponent(selectButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addGap(2, 2, 2) .addComponent(selectAllButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING) .addGroup(layout.createSequentialGroup() .addComponent(selectedVariableScrollPane, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addGap(18, 18, 18) .addComponent(groupLabel) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)) .addGroup(layout.createSequentialGroup() .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) .addGap(120, 120, 120))) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(selectedGroupButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(groupByTextField, GroupLayout.PREFERRED_SIZE, 28, GroupLayout.PREFERRED_SIZE))) .addComponent(jScrollPane1, 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(){ unselectedListModel.addAll(selectedListModel.getAll()); selectedListModel.clear(); if(groupByVariable!=null){ unselectedListModel.addElement(groupByVariable); groupByVariable = null; } groupByTextField.setText(""); selectedGroupButton.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 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 void setNameGroupTextField(String nameGroupTextField){ this.nameGroupTextField = nameGroupTextField; } /** * * @return array of selected variables. */ public VariableAttributes[] getSelectedVariables(){ VariableAttributes[] selected = selectedListModel.getAll(); return selected; } public VariableAttributes getGroupByVariable(){ return groupByVariable; } public boolean hasGroupingVariable(){ return groupByVariable!=null; } public VariableChangeListener getVariableChangedListener(){ return this; } public void variableChanged(VariableChangeEvent e){ if(e.getChangeType()== VariableChangeType.VARIABLE_DELETED){ VariableAttributes varAtt = e.getVariable(); unselectedListModel.removeElement(varAtt); selectedListModel.removeElement(varAtt); if(groupByVariable!=null && groupByVariable.equals(varAtt)){ groupByVariable=null; } }else if(e.getChangeType()==VariableChangeType.VARIABLE_ADDED){ VariableAttributes varAtt = e.getVariable(); unselectedListModel.addElement(varAtt); }else if(e.getChangeType()==VariableChangeType.VARIABLE_MODIFIED){ VariableAttributes varAtt = e.getVariable(); //do not use selectedListModel.replaceElement(v) because of need to filter variable if(selectedListModel.removeElement(varAtt)){ selectedListModel.addElement(varAtt); //will force filtering of modified variable }else{ //do not use variableListModel.replaceElement(v) because of need to filter variable unselectedListModel.removeElement(varAtt); unselectedListModel.addElement(varAtt); //will force filtering of modified variable } }else if(e.getChangeType()==VariableChangeType.VARIABLE_RENAMED){ VariableAttributes oldvarAtt = e.getOldVariable(); if(selectedListModel.removeElement(oldvarAtt)){ selectedListModel.addElement(e.getVariable()); }else if(groupByVariable!=null && groupByVariable.equals(oldvarAtt)){ groupByVariable=e.getVariable(); }else{ unselectedListModel.removeElement(oldvarAtt); unselectedListModel.addElement(e.getVariable()); } } } public void setUnselectedListCellRenderer(DefaultListCellRenderer renderer){ unselectedVariableList.setCellRenderer(renderer); } public void setSelectedVariableListCellRenderer(DefaultListCellRenderer renderer){ selectedVariableList.setCellRenderer(renderer); } public void repaintLists(){ unselectedVariableList.repaint(); selectedVariableList.repaint(); } 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); selectButton.setText(">"); selectButton.setToolTipText("Select variable"); selectAllButton.setText(">>"); selectAllButton.setToolTipText("Select all variables"); selectVariables = true; selectedGroupButton.setText(">"); selectedGroupButton.setToolTipText("Select group variable"); selectGroupVariable = 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; } } } public void focusLost(FocusEvent e){ //do nothing } } }