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 proguard.MemberSpecification;
24b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.ClassConstants;
25b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.util.ClassUtil;
26b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
27b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport javax.swing.*;
28b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport java.awt.*;
29b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport java.awt.event.*;
30b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport java.util.*;
31b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport java.util.List;
32b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
33b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
34b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/**
35b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This <code>ListPanel</code> allows the user to add, edit, move, and remove
36b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * MemberSpecification entries in a list.
37b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
38b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @author Eric Lafortune
39b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */
40b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratofinal class MemberSpecificationsPanel extends ListPanel
41b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{
42b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private final MemberSpecificationDialog fieldSpecificationDialog;
43b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private final MemberSpecificationDialog methodSpecificationDialog;
44b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
45b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
46b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public MemberSpecificationsPanel(JDialog owner, boolean fullKeepOptions)
47b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
48b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        super();
49b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
50b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        super.firstSelectionButton = fullKeepOptions ? 3 : 2;
51b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
52b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        list.setCellRenderer(new MyListCellRenderer());
53b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
54b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        fieldSpecificationDialog  = new MemberSpecificationDialog(owner, true);
55b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        methodSpecificationDialog = new MemberSpecificationDialog(owner, false);
56b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
57b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (fullKeepOptions)
58b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
59b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            addAddFieldButton();
60b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
61b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        addAddMethodButton();
62b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        addEditButton();
63b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        addRemoveButton();
64b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        addUpButton();
65b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        addDownButton();
66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
67b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        enableSelectionButtons();
68b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
69b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
70b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
71b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    protected void addAddFieldButton()
72b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
73b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        JButton addFieldButton = new JButton(msg("addField"));
74b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        addFieldButton.addActionListener(new ActionListener()
75b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
76b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            public void actionPerformed(ActionEvent e)
77b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
78b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                fieldSpecificationDialog.setMemberSpecification(new MemberSpecification());
79b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                int returnValue = fieldSpecificationDialog.showDialog();
80b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                if (returnValue == MemberSpecificationDialog.APPROVE_OPTION)
81b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
82b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    // Add the new element.
83b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    addElement(new MyMemberSpecificationWrapper(fieldSpecificationDialog.getMemberSpecification(),
84b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                                  true));
85b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
86b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
87b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        });
88b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
89b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        addButton(tip(addFieldButton, "addFieldTip"));
90b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
91b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
92b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
93b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    protected void addAddMethodButton()
94b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
95b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        JButton addMethodButton = new JButton(msg("addMethod"));
96b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        addMethodButton.addActionListener(new ActionListener()
97b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
98b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            public void actionPerformed(ActionEvent e)
99b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
100b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                methodSpecificationDialog.setMemberSpecification(new MemberSpecification());
101b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                int returnValue = methodSpecificationDialog.showDialog();
102b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                if (returnValue == MemberSpecificationDialog.APPROVE_OPTION)
103b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    // Add the new element.
105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    addElement(new MyMemberSpecificationWrapper(methodSpecificationDialog.getMemberSpecification(),
106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                                  false));
107b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        });
110b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        addButton(tip(addMethodButton, "addMethodTip"));
112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    protected void addEditButton()
116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        JButton editButton = new JButton(msg("edit"));
118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        editButton.addActionListener(new ActionListener()
119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            public void actionPerformed(ActionEvent e)
121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                MyMemberSpecificationWrapper wrapper =
123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    (MyMemberSpecificationWrapper)list.getSelectedValue();
124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
125b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                MemberSpecificationDialog memberSpecificationDialog =
126b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    wrapper.isField ?
127b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                        fieldSpecificationDialog :
128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                        methodSpecificationDialog;
129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                memberSpecificationDialog.setMemberSpecification(wrapper.memberSpecification);
131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                int returnValue = memberSpecificationDialog.showDialog();
132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                if (returnValue == MemberSpecificationDialog.APPROVE_OPTION)
133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    // Replace the old element.
135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    wrapper.memberSpecification = memberSpecificationDialog.getMemberSpecification();
136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    setElementAt(wrapper,
137b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                 list.getSelectedIndex());
138b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
139b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
140b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        });
141b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        addButton(tip(editButton, "editTip"));
143b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
144b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
145b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
146b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
147b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Sets the MemberSpecification instances to be represented in this panel.
148b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
149b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void setMemberSpecifications(List fieldSpecifications,
150b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                        List methodSpecifications)
151b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
152b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        listModel.clear();
153b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
154b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (fieldSpecifications != null)
155b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
156b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            for (int index = 0; index < fieldSpecifications.size(); index++)
157b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
158b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                listModel.addElement(
159b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    new MyMemberSpecificationWrapper((MemberSpecification)fieldSpecifications.get(index),
160b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                     true));
161b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
162b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
163b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
164b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (methodSpecifications != null)
165b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
166b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            for (int index = 0; index < methodSpecifications.size(); index++)
167b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
168b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                listModel.addElement(
169b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    new MyMemberSpecificationWrapper((MemberSpecification)methodSpecifications.get(index),
170b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                     false));
171b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
172b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
173b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
174b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Make sure the selection buttons are properly enabled,
175b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // since the clear method doesn't seem to notify the listener.
176b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        enableSelectionButtons();
177b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
178b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
179b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
180b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
181b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the MemberSpecification instances currently represented in
182b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * this panel, referring to fields or to methods.
183b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *
184b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param isField specifies whether specifications referring to fields or
185b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *                specifications referring to methods should be returned.
186b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
187b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public List getMemberSpecifications(boolean isField)
188b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
189b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        int size = listModel.size();
190b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (size == 0)
191b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
192b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            return null;
193b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
194b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
195b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        List memberSpecifications = new ArrayList(size);
196b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        for (int index = 0; index < size; index++)
197b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
198b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            MyMemberSpecificationWrapper wrapper =
199b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                (MyMemberSpecificationWrapper)listModel.get(index);
200b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
201b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (wrapper.isField == isField)
202b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
203b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                memberSpecifications.add(wrapper.memberSpecification);
204b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
205b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
206b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
207b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return memberSpecifications;
208b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
209b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
210b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
211b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
212b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * This ListCellRenderer renders MemberSpecification objects.
213b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
214b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private static class MyListCellRenderer implements ListCellRenderer
215b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
216b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        private final JLabel label = new JLabel();
217b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
218b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
219b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Implementations for ListCellRenderer.
220b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
221b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public Component getListCellRendererComponent(JList   list,
222b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                      Object  value,
223b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                      int     index,
224b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                      boolean isSelected,
225b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                      boolean cellHasFocus)
226b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
227b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            MyMemberSpecificationWrapper wrapper = (MyMemberSpecificationWrapper)value;
228b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
229b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            MemberSpecification option = wrapper.memberSpecification;
230b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            String name       = option.name;
231b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            String descriptor = option.descriptor;
232b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
233b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            label.setText(wrapper.isField ?
234b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                (descriptor == null ? name == null ?
235b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    "<fields>" :
236b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    "***" + ' ' + name :
237b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    ClassUtil.externalFullFieldDescription(0,
238b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                           name == null ? "*" : name,
239b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                           descriptor)) :
240b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                (descriptor == null ? name == null ?
241b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    "<methods>" :
242b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    "***" + ' ' + name + "(...)" :
2432270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                    ClassUtil.externalFullMethodDescription(ClassConstants.METHOD_NAME_INIT,
244b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                            0,
245b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                            name == null ? "*" : name,
246b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                            descriptor)));
247b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
248b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (isSelected)
249b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
250b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                label.setBackground(list.getSelectionBackground());
251b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                label.setForeground(list.getSelectionForeground());
252b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
253b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            else
254b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
255b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                label.setBackground(list.getBackground());
256b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                label.setForeground(list.getForeground());
257b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
258b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
259b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            label.setOpaque(true);
260b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
261b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            return label;
262b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
263b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
264b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
265b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
266b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
267b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Attaches the tool tip from the GUI resources that corresponds to the
268b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * given key, to the given component.
269b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
270b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private static JComponent tip(JComponent component, String messageKey)
271b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
272b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        component.setToolTipText(msg(messageKey));
273b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
274b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return component;
275b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
276b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
277b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
278b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
279b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the message from the GUI resources that corresponds to the given
280b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * key.
281b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
282b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private static String msg(String messageKey)
283b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
284b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato         return GUIResources.getMessage(messageKey);
285b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
286b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
287b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
288b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
289b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * This class wraps a MemberSpecification, additionally storing whether
290b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * the option refers to a field or to a method.
291b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
292b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private static class MyMemberSpecificationWrapper
293b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
294b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public MemberSpecification memberSpecification;
295b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public final boolean             isField;
296b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
297b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public MyMemberSpecificationWrapper(MemberSpecification memberSpecification,
298b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                            boolean             isField)
299b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
300b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            this.memberSpecification = memberSpecification;
301b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            this.isField                  = isField;
302b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
303b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
304b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}
305