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