1/* 2 * ProGuard -- shrinking, optimization, obfuscation, and preverification 3 * of Java bytecode. 4 * 5 * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu) 6 * 7 * This program is free software; you can redistribute it and/or modify it 8 * under the terms of the GNU General Public License as published by the Free 9 * Software Foundation; either version 2 of the License, or (at your option) 10 * any later version. 11 * 12 * This program is distributed in the hope that it will be useful, but WITHOUT 13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 15 * more details. 16 * 17 * You should have received a copy of the GNU General Public License along 18 * with this program; if not, write to the Free Software Foundation, Inc., 19 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20 */ 21package proguard.gui; 22 23import proguard.ClassSpecification; 24import proguard.classfile.util.ClassUtil; 25 26import javax.swing.*; 27import java.awt.*; 28import java.awt.event.*; 29import java.util.*; 30import java.util.List; 31 32 33/** 34 * This <code>ListPanel</code> allows the user to add, edit, move, and remove 35 * ClassSpecification entries in a list. 36 * 37 * @author Eric Lafortune 38 */ 39class ClassSpecificationsPanel extends ListPanel 40{ 41 protected final ClassSpecificationDialog classSpecificationDialog; 42 43 44 public ClassSpecificationsPanel(JFrame owner, boolean fullKeepOptions) 45 { 46 super(); 47 48 list.setCellRenderer(new MyListCellRenderer()); 49 50 classSpecificationDialog = new ClassSpecificationDialog(owner, fullKeepOptions); 51 52 addAddButton(); 53 addEditButton(); 54 addRemoveButton(); 55 addUpButton(); 56 addDownButton(); 57 58 enableSelectionButtons(); 59 } 60 61 62 protected void addAddButton() 63 { 64 JButton addButton = new JButton(msg("add")); 65 addButton.addActionListener(new ActionListener() 66 { 67 public void actionPerformed(ActionEvent e) 68 { 69 setClassSpecification(createClassSpecification()); 70 int returnValue = classSpecificationDialog.showDialog(); 71 if (returnValue == ClassSpecificationDialog.APPROVE_OPTION) 72 { 73 // Add the new element. 74 addElement(getClassSpecification()); 75 } 76 } 77 }); 78 79 addButton(tip(addButton, "addTip")); 80 } 81 82 83 protected void addEditButton() 84 { 85 JButton editButton = new JButton(msg("edit")); 86 editButton.addActionListener(new ActionListener() 87 { 88 public void actionPerformed(ActionEvent e) 89 { 90 ClassSpecification selectedClassSpecification = 91 (ClassSpecification)list.getSelectedValue(); 92 93 setClassSpecification(selectedClassSpecification); 94 int returnValue = classSpecificationDialog.showDialog(); 95 if (returnValue == ClassSpecificationDialog.APPROVE_OPTION) 96 { 97 // Replace the old element. 98 setElementAt(getClassSpecification(), 99 list.getSelectedIndex()); 100 } 101 } 102 }); 103 104 addButton(tip(editButton, "editTip")); 105 } 106 107 108 protected ClassSpecification createClassSpecification() 109 { 110 return new ClassSpecification(); 111 } 112 113 114 protected void setClassSpecification(ClassSpecification classSpecification) 115 { 116 classSpecificationDialog.setClassSpecification(classSpecification); 117 } 118 119 120 protected ClassSpecification getClassSpecification() 121 { 122 return classSpecificationDialog.getClassSpecification(); 123 } 124 125 126 /** 127 * Sets the ClassSpecification objects to be represented in this panel. 128 */ 129 public void setClassSpecifications(List classSpecifications) 130 { 131 listModel.clear(); 132 133 if (classSpecifications != null) 134 { 135 for (int index = 0; index < classSpecifications.size(); index++) 136 { 137 listModel.addElement(classSpecifications.get(index)); 138 } 139 } 140 141 // Make sure the selection buttons are properly enabled, 142 // since the clear method doesn't seem to notify the listener. 143 enableSelectionButtons(); 144 } 145 146 147 /** 148 * Returns the ClassSpecification objects currently represented in this panel. 149 */ 150 public List getClassSpecifications() 151 { 152 int size = listModel.size(); 153 if (size == 0) 154 { 155 return null; 156 } 157 158 List classSpecifications = new ArrayList(size); 159 for (int index = 0; index < size; index++) 160 { 161 classSpecifications.add(listModel.get(index)); 162 } 163 164 return classSpecifications; 165 } 166 167 168 /** 169 * Attaches the tool tip from the GUI resources that corresponds to the 170 * given key, to the given component. 171 */ 172 private static JComponent tip(JComponent component, String messageKey) 173 { 174 component.setToolTipText(msg(messageKey)); 175 176 return component; 177 } 178 179 180 /** 181 * Returns the message from the GUI resources that corresponds to the given 182 * key. 183 */ 184 private static String msg(String messageKey) 185 { 186 return GUIResources.getMessage(messageKey); 187 } 188 189 190 /** 191 * This ListCellRenderer renders ClassSpecification objects. 192 */ 193 private static class MyListCellRenderer implements ListCellRenderer 194 { 195 private final JLabel label = new JLabel(); 196 197 198 // Implementations for ListCellRenderer. 199 200 public Component getListCellRendererComponent(JList list, 201 Object value, 202 int index, 203 boolean isSelected, 204 boolean cellHasFocus) 205 { 206 ClassSpecification classSpecification = (ClassSpecification)value; 207 208 String comments = classSpecification.comments; 209 210 label.setText(comments != null ? comments.trim() : 211 classSpecification.className != null ? (msg("class") + ' ' + ClassUtil.externalClassName(classSpecification.className)) : 212 classSpecification.extendsClassName != null ? (msg("extensionsOf") + ' ' + ClassUtil.externalClassName(classSpecification.extendsClassName)) : 213 (msg("specificationNumber") + index)); 214 215 if (isSelected) 216 { 217 label.setBackground(list.getSelectionBackground()); 218 label.setForeground(list.getSelectionForeground()); 219 } 220 else 221 { 222 label.setBackground(list.getBackground()); 223 label.setForeground(list.getForeground()); 224 } 225 226 label.setOpaque(true); 227 228 return label; 229 } 230 } 231} 232