1b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/* 2b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ProGuard -- shrinking, optimization, obfuscation, and preverification 3b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * of Java bytecode. 4b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 5b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu) 6b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 7b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This program is free software; you can redistribute it and/or modify it 8b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * under the terms of the GNU General Public License as published by the Free 9b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Software Foundation; either version 2 of the License, or (at your option) 10b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * any later version. 11b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 12b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This program is distributed in the hope that it will be useful, but WITHOUT 13b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 14b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 15b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * more details. 16b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 17b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * You should have received a copy of the GNU General Public License along 18b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * with this program; if not, write to the Free Software Foundation, Inc., 19b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 21b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopackage proguard.gui; 22b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 23b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport java.awt.*; 24b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport java.awt.event.*; 25b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport java.util.List; 26b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport java.util.*; 27b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 28b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport javax.swing.*; 29b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport javax.swing.event.*; 30b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 31b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/** 32b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This <code>Jpanel</code> allows the user to move and remove entries in a 33b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * list and between lists. Extensions of this class should add buttons to add 34b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * and possibly edit entries, and to set and get the resulting list. 35b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 36b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @author Eric Lafortune 37b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 38b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoabstract class ListPanel extends JPanel 39b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{ 40b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected final DefaultListModel listModel = new DefaultListModel(); 41b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected final JList list = new JList(listModel); 42b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 43b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected int firstSelectionButton = 2; 44b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 45b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 46b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected ListPanel() 47b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 48b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato GridBagLayout layout = new GridBagLayout(); 49b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato setLayout(layout); 50b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 51b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato GridBagConstraints listConstraints = new GridBagConstraints(); 52b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato listConstraints.gridheight = GridBagConstraints.REMAINDER; 53b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato listConstraints.fill = GridBagConstraints.BOTH; 54b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato listConstraints.weightx = 1.0; 55b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato listConstraints.weighty = 1.0; 56b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato listConstraints.anchor = GridBagConstraints.NORTHWEST; 57b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato listConstraints.insets = new Insets(0, 2, 0, 2); 58b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 59b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Make sure some buttons are disabled or enabled depending on whether 60b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // the selection is empty or not. 61b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato list.addListSelectionListener(new ListSelectionListener() 62b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 63b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void valueChanged(ListSelectionEvent e) 64b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 65b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato enableSelectionButtons(); 66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 67b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato }); 68b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 69b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato add(new JScrollPane(list), listConstraints); 70b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 71b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // something like the following calls are up to the extending class: 72b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato //addAddButton(); 73b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato //addEditButton(); 74b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato //addRemoveButton(); 75b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato //addUpButton(); 76b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato //addDownButton(); 77b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // 78b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato //enableSelectionButtons(); 79b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 80b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 81b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 82b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected void addRemoveButton() 83b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 84b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JButton removeButton = new JButton(msg("remove")); 85b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato removeButton.addActionListener(new ActionListener() 86b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 87b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void actionPerformed(ActionEvent e) 88b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 89b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Remove the selected elements. 90b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato removeElementsAt(list.getSelectedIndices()); 91b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 92b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato }); 93b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 94b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato addButton(tip(removeButton, "removeTip")); 95b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 96b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 97b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 98b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected void addUpButton() 99b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 100b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JButton upButton = new JButton(msg("moveUp")); 101b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato upButton.addActionListener(new ActionListener() 102b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 103b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void actionPerformed(ActionEvent e) 104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int[] selectedIndices = list.getSelectedIndices(); 106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (selectedIndices.length > 0 && 107b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato selectedIndices[0] > 0) 108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Move the selected elements up. 110b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato moveElementsAt(selectedIndices, -1); 111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato }); 114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato addButton(tip(upButton, "moveUpTip")); 116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected void addDownButton() 120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JButton downButton = new JButton(msg("moveDown")); 122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato downButton.addActionListener(new ActionListener() 123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void actionPerformed(ActionEvent e) 125b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 126b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int[] selectedIndices = list.getSelectedIndices(); 127b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (selectedIndices.length > 0 && 128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato selectedIndices[selectedIndices.length-1] < listModel.getSize()-1) 129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Move the selected elements down. 131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato moveElementsAt(selectedIndices, 1); 132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato }); 135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato addButton(tip(downButton, "moveDownTip")); 137b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 138b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 139b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 140b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 141b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Adds a button that allows to copy or move entries to another ListPanel. 142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 143b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param buttonTextKey the button text key. 144b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param tipKey the tool tip key. 145b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @param panel the other ListPanel. 146b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 147b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void addCopyToPanelButton(String buttonTextKey, 148b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String tipKey, 149b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato final ListPanel panel) 150b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 151b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JButton moveButton = new JButton(msg(buttonTextKey)); 152b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato moveButton.addActionListener(new ActionListener() 153b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 154b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void actionPerformed(ActionEvent e) 155b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 156b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int[] selectedIndices = list.getSelectedIndices(); 157b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Object[] selectedElements = list.getSelectedValues(); 158b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 159b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Remove the selected elements from this panel. 160b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato removeElementsAt(selectedIndices); 161b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 162b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Add the elements to the other panel. 163b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato panel.addElements(selectedElements); 164b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 165b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato }); 166b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 167b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato addButton(tip(moveButton, tipKey)); 168b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 169b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 170b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 171b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected void addButton(JComponent button) 172b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 173b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato GridBagConstraints buttonConstraints = new GridBagConstraints(); 174b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato buttonConstraints.gridwidth = GridBagConstraints.REMAINDER; 175b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato buttonConstraints.fill = GridBagConstraints.HORIZONTAL; 176b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato buttonConstraints.anchor = GridBagConstraints.NORTHWEST; 177b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato buttonConstraints.insets = new Insets(0, 2, 0, 2); 178b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 179b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato add(button, buttonConstraints); 180b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 181b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 182b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 183b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 184b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns a list of all right-hand side buttons. 185b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 186b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public List getButtons() 187b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 188b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato List list = new ArrayList(getComponentCount()-1); 189b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 190b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Add all buttons. 191b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 1; index < getComponentCount(); index++) 192b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 193b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato list.add(getComponent(index)); 194b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 195b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 196b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return list; 197b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 198b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 199b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 200b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected void addElement(Object element) 201b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 202b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato listModel.addElement(element); 203b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 204b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Make sure it is selected. 205b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato list.setSelectedIndex(listModel.size() - 1); 206b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 207b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 208b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 209b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected void addElements(Object[] elements) 210b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 211b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Add the elements one by one. 212b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < elements.length; index++) 213b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 214b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato listModel.addElement(elements[index]); 215b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 216b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 217b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Make sure they are selected. 218b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int[] selectedIndices = new int[elements.length]; 219b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < selectedIndices.length; index++) 220b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 221b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato selectedIndices[index] = 222b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato listModel.size() - selectedIndices.length + index; 223b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 224b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato list.setSelectedIndices(selectedIndices); 225b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 226b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 227b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 228b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected void moveElementsAt(int[] indices, int offset) 229b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 230b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Remember the selected elements. 231b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Object[] selectedElements = list.getSelectedValues(); 232b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 233b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Remove the selected elements. 234b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato removeElementsAt(indices); 235b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 236b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Update the element indices. 237b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < indices.length; index++) 238b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 239b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato indices[index] += offset; 240b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 241b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 242b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Reinsert the selected elements. 243b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato insertElementsAt(selectedElements, indices); 244b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 245b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 246b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 247b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected void insertElementsAt(Object[] elements, int[] indices) 248b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 249b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < elements.length; index++) 250b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 251b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato listModel.insertElementAt(elements[index], indices[index]); 252b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 253b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 254b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Make sure they are selected. 255b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato list.setSelectedIndices(indices); 256b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 257b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 258b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 259b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected void setElementAt(Object element, int index) 260b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 261b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato listModel.setElementAt(element, index); 262b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 263b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Make sure it is selected. 264b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato list.setSelectedIndex(index); 265b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 266b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 267b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 268b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected void setElementsAt(Object[] elements, int[] indices) 269b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 270b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < elements.length; index++) 271b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 272b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato listModel.setElementAt(elements[index], indices[index]); 273b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 274b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 275b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Make sure they are selected. 276b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato list.setSelectedIndices(indices); 277b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 278b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 279b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 280b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected void removeElementsAt(int[] indices) 281b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 282b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = indices.length - 1; index >= 0; index--) 283b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 284b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato listModel.removeElementAt(indices[index]); 285b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 286b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 287b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Make sure nothing is selected. 288b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato list.clearSelection(); 289b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 290b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Make sure the selection buttons are properly enabled, 291b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // since the above method doesn't seem to notify the listener. 292b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato enableSelectionButtons(); 293b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 294b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 295b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 296b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected void removeAllElements() 297b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 298b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato listModel.removeAllElements(); 299b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 300b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Make sure the selection buttons are properly enabled, 301b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // since the above method doesn't seem to notify the listener. 302b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato enableSelectionButtons(); 303b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 304b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 305b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 306b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 307b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Enables or disables the buttons that depend on a selection. 308b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 309b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected void enableSelectionButtons() 310b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 311b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boolean selected = !list.isSelectionEmpty(); 312b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 313b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Loop over all components, except the list itself and the Add button. 314b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = firstSelectionButton; index < getComponentCount(); index++) 315b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 316b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato getComponent(index).setEnabled(selected); 317b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 318b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 319b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 320b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 321b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 322b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Attaches the tool tip from the GUI resources that corresponds to the 323b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * given key, to the given component. 324b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 325b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private static JComponent tip(JComponent component, String messageKey) 326b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 327b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato component.setToolTipText(msg(messageKey)); 328b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 329b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return component; 330b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 331b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 332b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 333b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 334b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the message from the GUI resources that corresponds to the given 335b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * key. 336b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 337b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private static String msg(String messageKey) 338b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 339b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return GUIResources.getMessage(messageKey); 340b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 341b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato} 342