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