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 proguard.*; 24b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.util.ClassUtil; 25b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.gui.splash.*; 26b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.util.ListUtil; 27b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 28b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport javax.swing.*; 29b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport javax.swing.border.*; 30b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport java.awt.*; 31b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport java.awt.event.*; 32b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport java.io.*; 33b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport java.net.URL; 34b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport java.util.*; 35b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport java.util.List; 36b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport java.lang.reflect.InvocationTargetException; 37b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 38b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 39b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/** 40b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * GUI for configuring and executing ProGuard and ReTrace. 41b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 42b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @author Eric Lafortune 43b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 44b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopublic class ProGuardGUI extends JFrame 45b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{ 46b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private static final String NO_SPLASH_OPTION = "-nosplash"; 47b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 48b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private static final String TITLE_IMAGE_FILE = "vtitle.png"; 49b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private static final String BOILERPLATE_CONFIGURATION = "boilerplate.pro"; 50b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private static final String DEFAULT_CONFIGURATION = "default.pro"; 51b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 52b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private static final String OPTIMIZATIONS_DEFAULT = "*"; 53b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private static final String KEEP_ATTRIBUTE_DEFAULT = "Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod"; 54b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private static final String SOURCE_FILE_ATTRIBUTE_DEFAULT = "SourceFile"; 55b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private static final String ADAPT_RESOURCE_FILE_NAMES_DEFAULT = "**.properties"; 56b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private static final String ADAPT_RESOURCE_FILE_CONTENTS_DEFAULT = "**.properties,META-INF/MANIFEST.MF"; 57b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 58b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private static final Border BORDER = BorderFactory.createEtchedBorder(EtchedBorder.RAISED); 59b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 60b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato static boolean systemOutRedirected; 61b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 62b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JFileChooser configurationChooser = new JFileChooser(""); 63b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JFileChooser fileChooser = new JFileChooser(""); 64b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 65b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final SplashPanel splashPanel; 66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 67b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final ClassPathPanel programPanel = new ClassPathPanel(this, true); 68b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final ClassPathPanel libraryPanel = new ClassPathPanel(this, false); 69b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 70b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private KeepClassSpecification[] boilerplateKeep; 71b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox[] boilerplateKeepCheckBoxes; 72b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JTextField[] boilerplateKeepTextFields; 73b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 74b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final KeepSpecificationsPanel additionalKeepPanel = new KeepSpecificationsPanel(this, true, false, false, false, false); 75b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 76b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private KeepClassSpecification[] boilerplateKeepNames; 77b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox[] boilerplateKeepNamesCheckBoxes; 78b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JTextField[] boilerplateKeepNamesTextFields; 79b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 80b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final KeepSpecificationsPanel additionalKeepNamesPanel = new KeepSpecificationsPanel(this, true, false, true, false, false); 81b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 82b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private ClassSpecification[] boilerplateNoSideEffectMethods; 83b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox[] boilerplateNoSideEffectMethodCheckBoxes; 84b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 85b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final ClassSpecificationsPanel additionalNoSideEffectsPanel = new ClassSpecificationsPanel(this, false); 86b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 87b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final ClassSpecificationsPanel whyAreYouKeepingPanel = new ClassSpecificationsPanel(this, false); 88b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 89b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox shrinkCheckBox = new JCheckBox(msg("shrink")); 90b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox printUsageCheckBox = new JCheckBox(msg("printUsage")); 91b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 92b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox optimizeCheckBox = new JCheckBox(msg("optimize")); 93b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox allowAccessModificationCheckBox = new JCheckBox(msg("allowAccessModification")); 94b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox mergeInterfacesAggressivelyCheckBox = new JCheckBox(msg("mergeInterfacesAggressively")); 95b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JLabel optimizationsLabel = new JLabel(msg("optimizations")); 96b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JLabel optimizationPassesLabel = new JLabel(msg("optimizationPasses")); 97b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 98b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JSpinner optimizationPassesSpinner = new JSpinner(new SpinnerNumberModel(1, 1, 9, 1)); 99b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 100b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox obfuscateCheckBox = new JCheckBox(msg("obfuscate")); 101b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox printMappingCheckBox = new JCheckBox(msg("printMapping")); 102b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox applyMappingCheckBox = new JCheckBox(msg("applyMapping")); 103b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox obfuscationDictionaryCheckBox = new JCheckBox(msg("obfuscationDictionary")); 104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox classObfuscationDictionaryCheckBox = new JCheckBox(msg("classObfuscationDictionary")); 105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox packageObfuscationDictionaryCheckBox = new JCheckBox(msg("packageObfuscationDictionary")); 106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox overloadAggressivelyCheckBox = new JCheckBox(msg("overloadAggressively")); 107b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox useUniqueClassMemberNamesCheckBox = new JCheckBox(msg("useUniqueClassMemberNames")); 108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox useMixedCaseClassNamesCheckBox = new JCheckBox(msg("useMixedCaseClassNames")); 109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox keepPackageNamesCheckBox = new JCheckBox(msg("keepPackageNames")); 110b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox flattenPackageHierarchyCheckBox = new JCheckBox(msg("flattenPackageHierarchy")); 111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox repackageClassesCheckBox = new JCheckBox(msg("repackageClasses")); 112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox keepAttributesCheckBox = new JCheckBox(msg("keepAttributes")); 113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox newSourceFileAttributeCheckBox = new JCheckBox(msg("renameSourceFileAttribute")); 114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox adaptClassStringsCheckBox = new JCheckBox(msg("adaptClassStrings")); 115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox adaptResourceFileNamesCheckBox = new JCheckBox(msg("adaptResourceFileNames")); 116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox adaptResourceFileContentsCheckBox = new JCheckBox(msg("adaptResourceFileContents")); 117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox preverifyCheckBox = new JCheckBox(msg("preverify")); 119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox microEditionCheckBox = new JCheckBox(msg("microEdition")); 120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox targetCheckBox = new JCheckBox(msg("target")); 121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JComboBox targetComboBox = new JComboBox(ListUtil.commaSeparatedList(msg("targets")).toArray()); 123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox verboseCheckBox = new JCheckBox(msg("verbose")); 125b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox noteCheckBox = new JCheckBox(msg("note")); 126b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox warnCheckBox = new JCheckBox(msg("warn")); 127b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox ignoreWarningsCheckBox = new JCheckBox(msg("ignoreWarnings")); 128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox skipNonPublicLibraryClassesCheckBox = new JCheckBox(msg("skipNonPublicLibraryClasses")); 129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox skipNonPublicLibraryClassMembersCheckBox = new JCheckBox(msg("skipNonPublicLibraryClassMembers")); 130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox keepDirectoriesCheckBox = new JCheckBox(msg("keepDirectories")); 131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox forceProcessingCheckBox = new JCheckBox(msg("forceProcessing")); 132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox printSeedsCheckBox = new JCheckBox(msg("printSeeds")); 133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox printConfigurationCheckBox = new JCheckBox(msg("printConfiguration")); 134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox dumpCheckBox = new JCheckBox(msg("dump")); 135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JTextField printUsageTextField = new JTextField(40); 137b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JTextField optimizationsTextField = new JTextField(40); 138b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JTextField printMappingTextField = new JTextField(40); 139b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JTextField applyMappingTextField = new JTextField(40); 140b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JTextField obfuscationDictionaryTextField = new JTextField(40); 141b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JTextField classObfuscationDictionaryTextField = new JTextField(40); 142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JTextField packageObfuscationDictionaryTextField = new JTextField(40); 143b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JTextField keepPackageNamesTextField = new JTextField(40); 144b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JTextField flattenPackageHierarchyTextField = new JTextField(40); 145b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JTextField repackageClassesTextField = new JTextField(40); 146b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JTextField keepAttributesTextField = new JTextField(40); 147b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JTextField newSourceFileAttributeTextField = new JTextField(40); 148b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JTextField adaptClassStringsTextField = new JTextField(40); 149b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JTextField adaptResourceFileNamesTextField = new JTextField(40); 150b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JTextField adaptResourceFileContentsTextField = new JTextField(40); 151b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JTextField noteTextField = new JTextField(40); 152b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JTextField warnTextField = new JTextField(40); 153b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JTextField keepDirectoriesTextField = new JTextField(40); 154b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JTextField printSeedsTextField = new JTextField(40); 155b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JTextField printConfigurationTextField = new JTextField(40); 156b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JTextField dumpTextField = new JTextField(40); 157b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 158b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JTextArea consoleTextArea = new JTextArea(msg("processingInfo"), 3, 40); 159b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 160b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JCheckBox reTraceVerboseCheckBox = new JCheckBox(msg("verbose")); 161b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JTextField reTraceMappingTextField = new JTextField(40); 162b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JTextArea stackTraceTextArea = new JTextArea(3, 40); 163b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final JTextArea reTraceTextArea = new JTextArea(msg("reTraceInfo"), 3, 40); 164b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 165b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 166b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 167b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Creates a new ProGuardGUI. 168b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 169b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public ProGuardGUI() 170b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 171b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato setTitle("ProGuard"); 172b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato setDefaultCloseOperation(EXIT_ON_CLOSE); 173b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 174b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Create some constraints that can be reused. 175b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato GridBagConstraints constraints = new GridBagConstraints(); 176b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato constraints.anchor = GridBagConstraints.WEST; 177b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato constraints.insets = new Insets(0, 4, 0, 4); 178b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 179b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato GridBagConstraints constraintsStretch = new GridBagConstraints(); 180b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato constraintsStretch.fill = GridBagConstraints.HORIZONTAL; 181b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato constraintsStretch.weightx = 1.0; 182b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato constraintsStretch.anchor = GridBagConstraints.WEST; 183b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato constraintsStretch.insets = constraints.insets; 184b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 185b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato GridBagConstraints constraintsLast = new GridBagConstraints(); 186b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato constraintsLast.gridwidth = GridBagConstraints.REMAINDER; 187b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato constraintsLast.anchor = GridBagConstraints.WEST; 188b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato constraintsLast.insets = constraints.insets; 189b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 190b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato GridBagConstraints constraintsLastStretch = new GridBagConstraints(); 191b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato constraintsLastStretch.gridwidth = GridBagConstraints.REMAINDER; 192b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato constraintsLastStretch.fill = GridBagConstraints.HORIZONTAL; 193b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato constraintsLastStretch.weightx = 1.0; 194b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato constraintsLastStretch.anchor = GridBagConstraints.WEST; 195b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato constraintsLastStretch.insets = constraints.insets; 196b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 197b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato GridBagConstraints splashPanelConstraints = new GridBagConstraints(); 198b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato splashPanelConstraints.gridwidth = GridBagConstraints.REMAINDER; 199b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato splashPanelConstraints.fill = GridBagConstraints.BOTH; 200b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato splashPanelConstraints.weightx = 1.0; 201b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato splashPanelConstraints.weighty = 0.02; 202b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato splashPanelConstraints.anchor = GridBagConstraints.NORTHWEST; 203b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato //splashPanelConstraints.insets = constraints.insets; 204b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 205b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato GridBagConstraints welcomeTextAreaConstraints = new GridBagConstraints(); 206b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato welcomeTextAreaConstraints.gridwidth = GridBagConstraints.REMAINDER; 207b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato welcomeTextAreaConstraints.fill = GridBagConstraints.NONE; 208b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato welcomeTextAreaConstraints.weightx = 1.0; 209b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato welcomeTextAreaConstraints.weighty = 0.01; 210b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato welcomeTextAreaConstraints.anchor = GridBagConstraints.CENTER;//NORTHWEST; 211b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato welcomeTextAreaConstraints.insets = new Insets(20, 40, 20, 40); 212b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 213b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato GridBagConstraints panelConstraints = new GridBagConstraints(); 214b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato panelConstraints.gridwidth = GridBagConstraints.REMAINDER; 215b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato panelConstraints.fill = GridBagConstraints.HORIZONTAL; 216b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato panelConstraints.weightx = 1.0; 217b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato panelConstraints.anchor = GridBagConstraints.NORTHWEST; 218b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato panelConstraints.insets = constraints.insets; 219b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 220b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato GridBagConstraints stretchPanelConstraints = new GridBagConstraints(); 221b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato stretchPanelConstraints.gridwidth = GridBagConstraints.REMAINDER; 222b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato stretchPanelConstraints.fill = GridBagConstraints.BOTH; 223b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato stretchPanelConstraints.weightx = 1.0; 224b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato stretchPanelConstraints.weighty = 1.0; 225b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato stretchPanelConstraints.anchor = GridBagConstraints.NORTHWEST; 226b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato stretchPanelConstraints.insets = constraints.insets; 227b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 228b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato GridBagConstraints glueConstraints = new GridBagConstraints(); 229b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato glueConstraints.fill = GridBagConstraints.BOTH; 230b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato glueConstraints.weightx = 0.01; 231b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato glueConstraints.weighty = 0.01; 232b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato glueConstraints.anchor = GridBagConstraints.NORTHWEST; 233b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato glueConstraints.insets = constraints.insets; 234b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 235b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato GridBagConstraints bottomButtonConstraints = new GridBagConstraints(); 236b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato bottomButtonConstraints.anchor = GridBagConstraints.SOUTHEAST; 237b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato bottomButtonConstraints.insets = new Insets(2, 2, 4, 6); 238b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato bottomButtonConstraints.ipadx = 10; 239b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato bottomButtonConstraints.ipady = 2; 240b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 241b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato GridBagConstraints lastBottomButtonConstraints = new GridBagConstraints(); 242b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato lastBottomButtonConstraints.gridwidth = GridBagConstraints.REMAINDER; 243b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato lastBottomButtonConstraints.anchor = GridBagConstraints.SOUTHEAST; 244b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato lastBottomButtonConstraints.insets = bottomButtonConstraints.insets; 245b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato lastBottomButtonConstraints.ipadx = bottomButtonConstraints.ipadx; 246b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato lastBottomButtonConstraints.ipady = bottomButtonConstraints.ipady; 247b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 248b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Leave room for a growBox on Mac OS X. 249b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (System.getProperty("os.name").toLowerCase().startsWith("mac os x")) 250b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 251b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato lastBottomButtonConstraints.insets = new Insets(2, 2, 4, 6 + 16); 252b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 253b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 254b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato GridBagLayout layout = new GridBagLayout(); 255b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 256b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configurationChooser.addChoosableFileFilter( 257b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new ExtensionFileFilter(msg("proExtension"), new String[] { ".pro" })); 258b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 259b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Create the opening panel. 260b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Sprite splash = 261b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new CompositeSprite(new Sprite[] 262b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 263b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new ColorSprite(new ConstantColor(Color.gray), 264b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new FontSprite(new ConstantFont(new Font("sansserif", Font.BOLD, 90)), 265b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new TextSprite(new ConstantString("ProGuard"), 266b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new ConstantInt(160), 267b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new LinearInt(-10, 120, new SmoothTiming(500, 1000))))), 268b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 269b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new ColorSprite(new ConstantColor(Color.white), 270b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new FontSprite(new ConstantFont(new Font("sansserif", Font.BOLD, 45)), 271b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new ShadowedSprite(new ConstantInt(3), 272b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new ConstantInt(3), 273b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new ConstantDouble(0.4), 274b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new ConstantInt(1), 275b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new CompositeSprite(new Sprite[] 276b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 277b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new TextSprite(new ConstantString(msg("shrinking")), 278b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new LinearInt(1000, 60, new SmoothTiming(1000, 2000)), 279b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new ConstantInt(70)), 280b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new TextSprite(new ConstantString(msg("optimization")), 281b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new LinearInt(1000, 400, new SmoothTiming(1500, 2500)), 282b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new ConstantInt(60)), 283b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new TextSprite(new ConstantString(msg("obfuscation")), 284b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new LinearInt(1000, 10, new SmoothTiming(2000, 3000)), 285b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new ConstantInt(145)), 286b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new TextSprite(new ConstantString(msg("preverification")), 287b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new LinearInt(1000, 350, new SmoothTiming(2500, 3500)), 288b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new ConstantInt(140)), 289b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new FontSprite(new ConstantFont(new Font("sansserif", Font.BOLD, 30)), 290b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new TextSprite(new TypeWriterString(msg("developed"), new LinearTiming(3500, 5500)), 291b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new ConstantInt(250), 292b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new ConstantInt(200))), 293b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato })))), 294b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato }); 295b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato splashPanel = new SplashPanel(splash, 0.5, 5500L); 296b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato splashPanel.setPreferredSize(new Dimension(0, 200)); 297b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 298b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JTextArea welcomeTextArea = new JTextArea(msg("proGuardInfo"), 18, 50); 299b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato welcomeTextArea.setOpaque(false); 300b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato welcomeTextArea.setEditable(false); 301b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato welcomeTextArea.setLineWrap(true); 302b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato welcomeTextArea.setWrapStyleWord(true); 303b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato welcomeTextArea.setPreferredSize(new Dimension(0, 0)); 304b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato welcomeTextArea.setBorder(new EmptyBorder(20, 20, 20, 20)); 305b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato addBorder(welcomeTextArea, "welcome"); 306b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 307b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JPanel proGuardPanel = new JPanel(layout); 308b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato proGuardPanel.add(splashPanel, splashPanelConstraints); 309b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato proGuardPanel.add(welcomeTextArea, welcomeTextAreaConstraints); 310b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 311b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Create the input panel. 312b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // TODO: properly clone the ClassPath objects. 313b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // This is awkward to implement in the generic ListPanel.addElements(...) 314b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // method, since the Object.clone() method is not public. 315b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato programPanel.addCopyToPanelButton("moveToLibraries", "moveToLibrariesTip", libraryPanel); 316b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato libraryPanel.addCopyToPanelButton("moveToProgram", "moveToProgramTip", programPanel); 317b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 318b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Collect all buttons of these panels and make sure they are equally 319b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // sized. 320b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato List panelButtons = new ArrayList(); 321b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato panelButtons.addAll(programPanel.getButtons()); 322b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato panelButtons.addAll(libraryPanel.getButtons()); 323b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato setCommonPreferredSize(panelButtons); 324b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 325b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato addBorder(programPanel, "programJars" ); 326b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato addBorder(libraryPanel, "libraryJars" ); 327b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 328b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JPanel inputOutputPanel = new JPanel(layout); 329b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato inputOutputPanel.add(tip(programPanel, "programJarsTip"), stretchPanelConstraints); 330b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato inputOutputPanel.add(tip(libraryPanel, "libraryJarsTip"), stretchPanelConstraints); 331b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 332b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Load the boiler plate options. 333b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato loadBoilerplateConfiguration(); 334b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 335b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Create the boiler plate keep panels. 336b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boilerplateKeepCheckBoxes = new JCheckBox[boilerplateKeep.length]; 337b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boilerplateKeepTextFields = new JTextField[boilerplateKeep.length]; 338b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 339b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JButton printUsageBrowseButton = createBrowseButton(printUsageTextField, 340b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato msg("selectUsageFile")); 341b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 342b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JPanel shrinkingOptionsPanel = new JPanel(layout); 343b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato addBorder(shrinkingOptionsPanel, "options"); 344b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 345b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato shrinkingOptionsPanel.add(tip(shrinkCheckBox, "shrinkTip"), constraintsLastStretch); 346b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato shrinkingOptionsPanel.add(tip(printUsageCheckBox, "printUsageTip"), constraints); 347b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato shrinkingOptionsPanel.add(tip(printUsageTextField, "outputFileTip"), constraintsStretch); 348b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato shrinkingOptionsPanel.add(tip(printUsageBrowseButton, "selectUsageFile"), constraintsLast); 349b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 350b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JPanel shrinkingPanel = new JPanel(layout); 351b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 352b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato shrinkingPanel.add(shrinkingOptionsPanel, panelConstraints); 353b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato addClassSpecifications(extractClassSpecifications(boilerplateKeep), 354b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato shrinkingPanel, 355b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boilerplateKeepCheckBoxes, 356b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boilerplateKeepTextFields); 357b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 358b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato addBorder(additionalKeepPanel, "keepAdditional"); 359b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato shrinkingPanel.add(tip(additionalKeepPanel, "keepAdditionalTip"), stretchPanelConstraints); 360b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 361b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Create the boiler plate keep names panels. 362b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boilerplateKeepNamesCheckBoxes = new JCheckBox[boilerplateKeepNames.length]; 363b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boilerplateKeepNamesTextFields = new JTextField[boilerplateKeepNames.length]; 364b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 365b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JButton printMappingBrowseButton = createBrowseButton(printMappingTextField, 366b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato msg("selectPrintMappingFile")); 367b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JButton applyMappingBrowseButton = createBrowseButton(applyMappingTextField, 368b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato msg("selectApplyMappingFile")); 369b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JButton obfucationDictionaryBrowseButton = createBrowseButton(obfuscationDictionaryTextField, 370b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato msg("selectObfuscationDictionaryFile")); 371b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JButton classObfucationDictionaryBrowseButton = createBrowseButton(classObfuscationDictionaryTextField, 372b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato msg("selectObfuscationDictionaryFile")); 373b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JButton packageObfucationDictionaryBrowseButton = createBrowseButton(packageObfuscationDictionaryTextField, 374b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato msg("selectObfuscationDictionaryFile")); 375b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 376b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JPanel obfuscationOptionsPanel = new JPanel(layout); 377b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato addBorder(obfuscationOptionsPanel, "options"); 378b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 379b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationOptionsPanel.add(tip(obfuscateCheckBox, "obfuscateTip"), constraintsLastStretch); 380b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationOptionsPanel.add(tip(printMappingCheckBox, "printMappingTip"), constraints); 381b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationOptionsPanel.add(tip(printMappingTextField, "outputFileTip"), constraintsStretch); 382b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationOptionsPanel.add(tip(printMappingBrowseButton, "selectPrintMappingFile"), constraintsLast); 383b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationOptionsPanel.add(tip(applyMappingCheckBox, "applyMappingTip"), constraints); 384b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationOptionsPanel.add(tip(applyMappingTextField, "inputFileTip"), constraintsStretch); 385b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationOptionsPanel.add(tip(applyMappingBrowseButton, "selectApplyMappingFile"), constraintsLast); 386b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationOptionsPanel.add(tip(obfuscationDictionaryCheckBox, "obfuscationDictionaryTip"), constraints); 387b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationOptionsPanel.add(tip(obfuscationDictionaryTextField, "inputFileTip"), constraintsStretch); 388b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationOptionsPanel.add(tip(obfucationDictionaryBrowseButton, "selectObfuscationDictionaryFile"), constraintsLast); 389b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationOptionsPanel.add(tip(classObfuscationDictionaryCheckBox, "classObfuscationDictionaryTip"), constraints); 390b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationOptionsPanel.add(tip(classObfuscationDictionaryTextField, "inputFileTip"), constraintsStretch); 391b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationOptionsPanel.add(tip(classObfucationDictionaryBrowseButton, "selectObfuscationDictionaryFile"), constraintsLast); 392b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationOptionsPanel.add(tip(packageObfuscationDictionaryCheckBox, "packageObfuscationDictionaryTip"), constraints); 393b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationOptionsPanel.add(tip(packageObfuscationDictionaryTextField, "inputFileTip"), constraintsStretch); 394b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationOptionsPanel.add(tip(packageObfucationDictionaryBrowseButton, "selectObfuscationDictionaryFile"), constraintsLast); 395b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationOptionsPanel.add(tip(overloadAggressivelyCheckBox, "overloadAggressivelyTip"), constraintsLastStretch); 396b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationOptionsPanel.add(tip(useUniqueClassMemberNamesCheckBox, "useUniqueClassMemberNamesTip"), constraintsLastStretch); 397b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationOptionsPanel.add(tip(useMixedCaseClassNamesCheckBox, "useMixedCaseClassNamesTip"), constraintsLastStretch); 398b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationOptionsPanel.add(tip(keepPackageNamesCheckBox, "keepPackageNamesTip"), constraints); 399b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationOptionsPanel.add(tip(keepPackageNamesTextField, "packageNamesTip"), constraintsLastStretch); 400b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationOptionsPanel.add(tip(flattenPackageHierarchyCheckBox, "flattenPackageHierarchyTip"), constraints); 401b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationOptionsPanel.add(tip(flattenPackageHierarchyTextField, "packageTip"), constraintsLastStretch); 402b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationOptionsPanel.add(tip(repackageClassesCheckBox, "repackageClassesTip"), constraints); 403b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationOptionsPanel.add(tip(repackageClassesTextField, "packageTip"), constraintsLastStretch); 404b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationOptionsPanel.add(tip(keepAttributesCheckBox, "keepAttributesTip"), constraints); 405b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationOptionsPanel.add(tip(keepAttributesTextField, "attributesTip"), constraintsLastStretch); 406b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationOptionsPanel.add(tip(newSourceFileAttributeCheckBox, "renameSourceFileAttributeTip"), constraints); 407b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationOptionsPanel.add(tip(newSourceFileAttributeTextField, "sourceFileAttributeTip"), constraintsLastStretch); 408b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationOptionsPanel.add(tip(adaptClassStringsCheckBox, "adaptClassStringsTip"), constraints); 409b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationOptionsPanel.add(tip(adaptClassStringsTextField, "classNamesTip"), constraintsLastStretch); 410b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationOptionsPanel.add(tip(adaptResourceFileNamesCheckBox, "adaptResourceFileNamesTip"), constraints); 411b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationOptionsPanel.add(tip(adaptResourceFileNamesTextField, "fileNameFilterTip"), constraintsLastStretch); 412b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationOptionsPanel.add(tip(adaptResourceFileContentsCheckBox, "adaptResourceFileContentsTip"), constraints); 413b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationOptionsPanel.add(tip(adaptResourceFileContentsTextField, "fileNameFilterTip"), constraintsLastStretch); 414b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 415b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JPanel obfuscationPanel = new JPanel(layout); 416b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 417b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationPanel.add(obfuscationOptionsPanel, panelConstraints); 418b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato addClassSpecifications(extractClassSpecifications(boilerplateKeepNames), 419b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationPanel, 420b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boilerplateKeepNamesCheckBoxes, 421b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boilerplateKeepNamesTextFields); 422b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 423b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato addBorder(additionalKeepNamesPanel, "keepNamesAdditional"); 424b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationPanel.add(tip(additionalKeepNamesPanel, "keepNamesAdditionalTip"), stretchPanelConstraints); 425b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 426b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Create the boiler plate "no side effect methods" panels. 427b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boilerplateNoSideEffectMethodCheckBoxes = new JCheckBox[boilerplateNoSideEffectMethods.length]; 428b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 429b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JPanel optimizationOptionsPanel = new JPanel(layout); 430b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato addBorder(optimizationOptionsPanel, "options"); 431b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 432b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JButton optimizationsButton = 433b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato createOptimizationsButton(optimizationsTextField); 434b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 435b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato optimizationOptionsPanel.add(tip(optimizeCheckBox, "optimizeTip"), constraintsLastStretch); 436b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato optimizationOptionsPanel.add(tip(allowAccessModificationCheckBox, "allowAccessModificationTip"), constraintsLastStretch); 437b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato optimizationOptionsPanel.add(tip(mergeInterfacesAggressivelyCheckBox, "mergeInterfacesAggressivelyTip"), constraintsLastStretch); 438b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato optimizationOptionsPanel.add(tip(optimizationsLabel, "optimizationsTip"), constraints); 439b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato optimizationOptionsPanel.add(tip(optimizationsTextField, "optimizationsFilterTip"), constraintsStretch); 440b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato optimizationOptionsPanel.add(tip(optimizationsButton, "optimizationsSelectTip"), constraintsLast); 441b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato optimizationOptionsPanel.add(tip(optimizationPassesLabel, "optimizationPassesTip"), constraints); 442b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato optimizationOptionsPanel.add(tip(optimizationPassesSpinner, "optimizationPassesTip"), constraintsLast); 443b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 444b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JPanel optimizationPanel = new JPanel(layout); 445b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 446b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato optimizationPanel.add(optimizationOptionsPanel, panelConstraints); 447b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato addClassSpecifications(boilerplateNoSideEffectMethods, 448b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato optimizationPanel, 449b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boilerplateNoSideEffectMethodCheckBoxes, 450b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato null); 451b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 452b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato addBorder(additionalNoSideEffectsPanel, "assumeNoSideEffectsAdditional"); 453b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato optimizationPanel.add(tip(additionalNoSideEffectsPanel, "assumeNoSideEffectsAdditionalTip"), stretchPanelConstraints); 454b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 455b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Create the options panel. 456b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JPanel preverificationOptionsPanel = new JPanel(layout); 457b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato addBorder(preverificationOptionsPanel, "preverificationAndTargeting"); 458b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 459b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato preverificationOptionsPanel.add(tip(preverifyCheckBox, "preverifyTip"), constraintsLastStretch); 460b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato preverificationOptionsPanel.add(tip(microEditionCheckBox, "microEditionTip"), constraintsLastStretch); 461b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato preverificationOptionsPanel.add(tip(targetCheckBox, "targetTip"), constraints); 462b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato preverificationOptionsPanel.add(tip(targetComboBox, "targetTip"), constraintsLast); 463b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 464b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JButton printSeedsBrowseButton = 465b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato createBrowseButton(printSeedsTextField, msg("selectSeedsFile")); 466b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 467b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JButton printConfigurationBrowseButton = 468b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato createBrowseButton(printConfigurationTextField, msg( "selectConfigurationFile")); 469b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 470b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JButton dumpBrowseButton = 471b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato createBrowseButton(dumpTextField, msg("selectDumpFile")); 472b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 473b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Select the most recent target by default. 474b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato targetComboBox.setSelectedIndex(targetComboBox.getItemCount() - 1); 475b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 476b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JPanel consistencyPanel = new JPanel(layout); 477b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato addBorder(consistencyPanel, "consistencyAndCorrectness"); 478b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 479b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato consistencyPanel.add(tip(verboseCheckBox, "verboseTip"), constraintsLastStretch); 480b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato consistencyPanel.add(tip(noteCheckBox, "noteTip"), constraints); 481b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato consistencyPanel.add(tip(noteTextField, "noteFilterTip"), constraintsLastStretch); 482b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato consistencyPanel.add(tip(warnCheckBox, "warnTip"), constraints); 483b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato consistencyPanel.add(tip(warnTextField, "warnFilterTip"), constraintsLastStretch); 484b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato consistencyPanel.add(tip(ignoreWarningsCheckBox, "ignoreWarningsTip"), constraintsLastStretch); 485b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato consistencyPanel.add(tip(skipNonPublicLibraryClassesCheckBox, "skipNonPublicLibraryClassesTip"), constraintsLastStretch); 486b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato consistencyPanel.add(tip(skipNonPublicLibraryClassMembersCheckBox, "skipNonPublicLibraryClassMembersTip"), constraintsLastStretch); 487b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato consistencyPanel.add(tip(keepDirectoriesCheckBox, "keepDirectoriesTip"), constraints); 488b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato consistencyPanel.add(tip(keepDirectoriesTextField, "directoriesTip"), constraintsLastStretch); 489b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato consistencyPanel.add(tip(forceProcessingCheckBox, "forceProcessingTip"), constraintsLastStretch); 490b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato consistencyPanel.add(tip(printSeedsCheckBox, "printSeedsTip"), constraints); 491b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato consistencyPanel.add(tip(printSeedsTextField, "outputFileTip"), constraintsStretch); 492b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato consistencyPanel.add(tip(printSeedsBrowseButton, "selectSeedsFile"), constraintsLast); 493b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato consistencyPanel.add(tip(printConfigurationCheckBox, "printConfigurationTip"), constraints); 494b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato consistencyPanel.add(tip(printConfigurationTextField, "outputFileTip"), constraintsStretch); 495b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato consistencyPanel.add(tip(printConfigurationBrowseButton, "selectConfigurationFile"), constraintsLast); 496b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato consistencyPanel.add(tip(dumpCheckBox, "dumpTip"), constraints); 497b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato consistencyPanel.add(tip(dumpTextField, "outputFileTip"), constraintsStretch); 498b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato consistencyPanel.add(tip(dumpBrowseButton, "selectDumpFile"), constraintsLast); 499b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 500b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Collect all components that are followed by text fields and make 501b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // sure they are equally sized. That way the text fields start at the 502b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // same horizontal position. 503b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato setCommonPreferredSize(Arrays.asList(new JComponent[] { 504b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato printMappingCheckBox, 505b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato applyMappingCheckBox, 506b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato flattenPackageHierarchyCheckBox, 507b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato repackageClassesCheckBox, 508b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato newSourceFileAttributeCheckBox, 509b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato })); 510b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 511b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JPanel optionsPanel = new JPanel(layout); 512b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 513b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato optionsPanel.add(preverificationOptionsPanel, panelConstraints); 514b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato optionsPanel.add(consistencyPanel, panelConstraints); 515b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 516b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato addBorder(whyAreYouKeepingPanel, "whyAreYouKeeping"); 517b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato optionsPanel.add(tip(whyAreYouKeepingPanel, "whyAreYouKeepingTip"), stretchPanelConstraints); 518b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 519b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Create the process panel. 520b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato consoleTextArea.setOpaque(false); 521b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato consoleTextArea.setEditable(false); 522b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato consoleTextArea.setLineWrap(false); 523b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato consoleTextArea.setWrapStyleWord(false); 524b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JScrollPane consoleScrollPane = new JScrollPane(consoleTextArea); 525b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato consoleScrollPane.setBorder(new EmptyBorder(1, 1, 1, 1)); 526b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato addBorder(consoleScrollPane, "processingConsole"); 527b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 528b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JPanel processPanel = new JPanel(layout); 529b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato processPanel.add(consoleScrollPane, stretchPanelConstraints); 530b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 531b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Create the load, save, and process buttons. 532b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JButton loadButton = new JButton(msg("loadConfiguration")); 533b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato loadButton.addActionListener(new MyLoadConfigurationActionListener()); 534b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 535b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JButton viewButton = new JButton(msg("viewConfiguration")); 536b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato viewButton.addActionListener(new MyViewConfigurationActionListener()); 537b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 538b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JButton saveButton = new JButton(msg("saveConfiguration")); 539b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato saveButton.addActionListener(new MySaveConfigurationActionListener()); 540b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 541b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JButton processButton = new JButton(msg("process")); 542b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato processButton.addActionListener(new MyProcessActionListener()); 543b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 544b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Create the ReTrace panel. 545b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JPanel reTraceSettingsPanel = new JPanel(layout); 546b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato addBorder(reTraceSettingsPanel, "reTraceSettings"); 547b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 548b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JButton reTraceMappingBrowseButton = createBrowseButton(reTraceMappingTextField, 549b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato msg("selectApplyMappingFile")); 550b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 551b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JLabel reTraceMappingLabel = new JLabel(msg("mappingFile")); 552b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato reTraceMappingLabel.setForeground(reTraceVerboseCheckBox.getForeground()); 553b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 554b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato reTraceSettingsPanel.add(tip(reTraceVerboseCheckBox, "verboseTip"), constraintsLastStretch); 555b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato reTraceSettingsPanel.add(tip(reTraceMappingLabel, "mappingFileTip"), constraints); 556b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato reTraceSettingsPanel.add(tip(reTraceMappingTextField, "inputFileTip"), constraintsStretch); 557b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato reTraceSettingsPanel.add(tip(reTraceMappingBrowseButton, "selectApplyMappingFile"), constraintsLast); 558b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 559b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato stackTraceTextArea.setOpaque(true); 560b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato stackTraceTextArea.setEditable(true); 561b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato stackTraceTextArea.setLineWrap(false); 562b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato stackTraceTextArea.setWrapStyleWord(true); 563b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JScrollPane stackTraceScrollPane = new JScrollPane(stackTraceTextArea); 564b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato addBorder(stackTraceScrollPane, "obfuscatedStackTrace"); 565b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 566b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato reTraceTextArea.setOpaque(false); 567b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato reTraceTextArea.setEditable(false); 568b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato reTraceTextArea.setLineWrap(true); 569b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato reTraceTextArea.setWrapStyleWord(true); 570b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JScrollPane reTraceScrollPane = new JScrollPane(reTraceTextArea); 571b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato reTraceScrollPane.setBorder(new EmptyBorder(1, 1, 1, 1)); 572b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato addBorder(reTraceScrollPane, "deobfuscatedStackTrace"); 573b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 574b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JPanel reTracePanel = new JPanel(layout); 575b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato reTracePanel.add(reTraceSettingsPanel, panelConstraints); 576b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato reTracePanel.add(tip(stackTraceScrollPane, "obfuscatedStackTraceTip"), panelConstraints); 577b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato reTracePanel.add(reTraceScrollPane, stretchPanelConstraints); 578b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 579b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Create the load button. 580b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JButton loadStackTraceButton = new JButton(msg("loadStackTrace")); 581b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato loadStackTraceButton.addActionListener(new MyLoadStackTraceActionListener()); 582b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 583b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JButton reTraceButton = new JButton(msg("reTrace")); 584b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato reTraceButton.addActionListener(new MyReTraceActionListener()); 585b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 586b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Create the main tabbed pane. 587b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato TabbedPane tabs = new TabbedPane(); 588b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato tabs.add(msg("proGuardTab"), proGuardPanel); 589b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato tabs.add(msg("inputOutputTab"), inputOutputPanel); 590b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato tabs.add(msg("shrinkingTab"), shrinkingPanel); 591b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato tabs.add(msg("obfuscationTab"), obfuscationPanel); 592b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato tabs.add(msg("optimizationTab"), optimizationPanel); 593b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato tabs.add(msg("informationTab"), optionsPanel); 594b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato tabs.add(msg("processTab"), processPanel); 595b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato tabs.add(msg("reTraceTab"), reTracePanel); 596b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato tabs.addImage(Toolkit.getDefaultToolkit().getImage( 597b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.getClass().getResource(TITLE_IMAGE_FILE))); 598b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 599b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Add the bottom buttons to each panel. 600b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato proGuardPanel .add(Box.createGlue(), glueConstraints); 601b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato proGuardPanel .add(tip(loadButton, "loadConfigurationTip"), bottomButtonConstraints); 602b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato proGuardPanel .add(createNextButton(tabs), lastBottomButtonConstraints); 603b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 604b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato inputOutputPanel .add(Box.createGlue(), glueConstraints); 605b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato inputOutputPanel .add(createPreviousButton(tabs), bottomButtonConstraints); 606b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato inputOutputPanel .add(createNextButton(tabs), lastBottomButtonConstraints); 607b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 608b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato shrinkingPanel .add(Box.createGlue(), glueConstraints); 609b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato shrinkingPanel .add(createPreviousButton(tabs), bottomButtonConstraints); 610b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato shrinkingPanel .add(createNextButton(tabs), lastBottomButtonConstraints); 611b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 612b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationPanel .add(Box.createGlue(), glueConstraints); 613b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationPanel .add(createPreviousButton(tabs), bottomButtonConstraints); 614b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationPanel .add(createNextButton(tabs), lastBottomButtonConstraints); 615b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 616b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato optimizationPanel .add(Box.createGlue(), glueConstraints); 617b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato optimizationPanel .add(createPreviousButton(tabs), bottomButtonConstraints); 618b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato optimizationPanel .add(createNextButton(tabs), lastBottomButtonConstraints); 619b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 620b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato optionsPanel .add(Box.createGlue(), glueConstraints); 621b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato optionsPanel .add(createPreviousButton(tabs), bottomButtonConstraints); 622b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato optionsPanel .add(createNextButton(tabs), lastBottomButtonConstraints); 623b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 624b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato processPanel .add(Box.createGlue(), glueConstraints); 625b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato processPanel .add(createPreviousButton(tabs), bottomButtonConstraints); 626b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato processPanel .add(tip(viewButton, "viewConfigurationTip"), bottomButtonConstraints); 627b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato processPanel .add(tip(saveButton, "saveConfigurationTip"), bottomButtonConstraints); 628b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato processPanel .add(tip(processButton, "processTip"), lastBottomButtonConstraints); 629b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 630b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato reTracePanel .add(Box.createGlue(), glueConstraints); 631b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato reTracePanel .add(tip(loadStackTraceButton, "loadStackTraceTip"), bottomButtonConstraints); 632b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato reTracePanel .add(tip(reTraceButton, "reTraceTip"), lastBottomButtonConstraints); 633b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 634b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Initialize the GUI settings to reasonable defaults. 635b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato loadConfiguration(this.getClass().getResource(DEFAULT_CONFIGURATION)); 636b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 637b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Add the main tabs to the frame and pack it. 638b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato getContentPane().add(tabs); 639b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 640b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 641b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 642b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void startSplash() 643b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 644b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato splashPanel.start(); 645b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 646b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 647b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 648b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void skipSplash() 649b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 650b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato splashPanel.stop(); 651b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 652b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 653b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 654b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 655b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Loads the boilerplate keep class options from the boilerplate file 656b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * into the boilerplate array. 657b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 658b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private void loadBoilerplateConfiguration() 659b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 660b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato try 661b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 662b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Parse the boilerplate configuration file. 663b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ConfigurationParser parser = new ConfigurationParser( 664b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.getClass().getResource(BOILERPLATE_CONFIGURATION)); 665b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Configuration configuration = new Configuration(); 666b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 667b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato try 668b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 669b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato parser.parse(configuration); 670b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 671b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // We're interested in the keep options. 672b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boilerplateKeep = 673b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato extractKeepSpecifications(configuration.keep, false, false); 674b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 675b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // We're interested in the keep options. 676b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boilerplateKeepNames = 677b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato extractKeepSpecifications(configuration.keep, true, false); 678b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 679b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // We're interested in the side effects options. 680b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boilerplateNoSideEffectMethods = new ClassSpecification[configuration.assumeNoSideEffects.size()]; 681b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.assumeNoSideEffects.toArray(boilerplateNoSideEffectMethods); 682b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 683b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato finally 684b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 685b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato parser.close(); 686b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 687b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 688b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato catch (Exception ex) 689b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 690b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ex.printStackTrace(); 691b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 692b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 693b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 694b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 695b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 696b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns an array containing the ClassSpecifications instances with 697b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * matching flags. 698b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 699b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private KeepClassSpecification[] extractKeepSpecifications(List keepSpecifications, 700b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boolean allowShrinking, 701b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boolean allowObfuscation) 702b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 703b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato List matches = new ArrayList(); 704b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 705b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < keepSpecifications.size(); index++) 706b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 707b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato KeepClassSpecification keepClassSpecification = (KeepClassSpecification)keepSpecifications.get(index); 708b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (keepClassSpecification.allowShrinking == allowShrinking && 709b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato keepClassSpecification.allowObfuscation == allowObfuscation) 710b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 711b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato matches.add(keepClassSpecification); 712b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 713b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 714b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 715b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato KeepClassSpecification[] matchingKeepClassSpecifications = new KeepClassSpecification[matches.size()]; 716b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato matches.toArray(matchingKeepClassSpecifications); 717b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 718b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return matchingKeepClassSpecifications; 719b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 720b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 721b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 722b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 723b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns an array containing the ClassSpecification instances of the 724b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * given array of KeepClassSpecification instances. 725b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 726b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private ClassSpecification[] extractClassSpecifications(KeepClassSpecification[] keepClassSpecifications) 727b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 728b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ClassSpecification[] classSpecifications = new ClassSpecification[keepClassSpecifications.length]; 729b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 730b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < classSpecifications.length; index++) 731b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 732b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato classSpecifications[index] = keepClassSpecifications[index]; 733b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 734b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 735b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return classSpecifications; 736b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 737b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 738b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 739b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 740b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Creates a panel with the given boiler plate class specifications. 741b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 742b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private void addClassSpecifications(ClassSpecification[] boilerplateClassSpecifications, 743b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JPanel classSpecificationsPanel, 744b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JCheckBox[] boilerplateCheckBoxes, 745b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JTextField[] boilerplateTextFields) 746b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 747b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Create some constraints that can be reused. 748b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato GridBagConstraints constraints = new GridBagConstraints(); 749b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato constraints.anchor = GridBagConstraints.WEST; 750b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato constraints.insets = new Insets(0, 4, 0, 4); 751b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 752b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato GridBagConstraints constraintsLastStretch = new GridBagConstraints(); 753b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato constraintsLastStretch.gridwidth = GridBagConstraints.REMAINDER; 754b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato constraintsLastStretch.fill = GridBagConstraints.HORIZONTAL; 755b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato constraintsLastStretch.weightx = 1.0; 756b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato constraintsLastStretch.anchor = GridBagConstraints.WEST; 757b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato constraintsLastStretch.insets = constraints.insets; 758b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 759b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato GridBagConstraints panelConstraints = new GridBagConstraints(); 760b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato panelConstraints.gridwidth = GridBagConstraints.REMAINDER; 761b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato panelConstraints.fill = GridBagConstraints.HORIZONTAL; 762b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato panelConstraints.weightx = 1.0; 763b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato panelConstraints.anchor = GridBagConstraints.NORTHWEST; 764b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato panelConstraints.insets = constraints.insets; 765b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 766b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato GridBagLayout layout = new GridBagLayout(); 767b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 768b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String lastPanelName = null; 769b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JPanel keepSubpanel = null; 770b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < boilerplateClassSpecifications.length; index++) 771b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 772b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // The panel structure is derived from the comments. 773b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String comments = boilerplateClassSpecifications[index].comments; 774b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int dashIndex = comments.indexOf('-'); 775b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int periodIndex = comments.indexOf('.', dashIndex); 776b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String panelName = comments.substring(0, dashIndex).trim(); 777b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String optionName = comments.substring(dashIndex + 1, periodIndex).replace('_', '.').trim(); 778b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String toolTip = comments.substring(periodIndex + 1); 779b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (keepSubpanel == null || !panelName.equals(lastPanelName)) 780b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 781b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Create a new keep subpanel and add it. 782b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato keepSubpanel = new JPanel(layout); 783b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato keepSubpanel.setBorder(BorderFactory.createTitledBorder(BORDER, panelName)); 784b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato classSpecificationsPanel.add(keepSubpanel, panelConstraints); 785b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 786b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato lastPanelName = panelName; 787b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 788b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 789b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Add the check box to the subpanel. 790b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JCheckBox boilerplateCheckBox = new JCheckBox(optionName); 791b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boilerplateCheckBox.setToolTipText(toolTip); 792b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boilerplateCheckBoxes[index] = boilerplateCheckBox; 793b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato keepSubpanel.add(boilerplateCheckBox, 794b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boilerplateTextFields != null ? 795b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato constraints : 796b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato constraintsLastStretch); 797b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 798b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (boilerplateTextFields != null) 799b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 800b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Add the text field to the subpanel. 801b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boilerplateTextFields[index] = new JTextField(40); 802b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato keepSubpanel.add(tip(boilerplateTextFields[index], "classNamesTip"), constraintsLastStretch); 803b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 804b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 805b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 806b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 807b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 808b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 809b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Adds a standard border with the title that corresponds to the given key 810b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * in the GUI resources. 811b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 812b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private void addBorder(JComponent component, String titleKey) 813b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 814b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Border oldBorder = component.getBorder(); 815b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Border newBorder = BorderFactory.createTitledBorder(BORDER, msg(titleKey)); 816b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 817b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato component.setBorder(oldBorder == null ? 818b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato newBorder : 819b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new CompoundBorder(newBorder, oldBorder)); 820b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 821b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 822b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 823b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 824b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Creates a Previous button for the given tabbed pane. 825b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 826b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private JButton createPreviousButton(final TabbedPane tabbedPane) 827b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 828b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JButton browseButton = new JButton(msg("previous")); 829b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato browseButton.addActionListener(new ActionListener() 830b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 831b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void actionPerformed(ActionEvent e) 832b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 833b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato tabbedPane.previous(); 834b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 835b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato }); 836b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 837b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return browseButton; 838b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 839b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 840b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 841b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 842b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Creates a Next button for the given tabbed pane. 843b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 844b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private JButton createNextButton(final TabbedPane tabbedPane) 845b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 846b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JButton browseButton = new JButton(msg("next")); 847b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato browseButton.addActionListener(new ActionListener() 848b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 849b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void actionPerformed(ActionEvent e) 850b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 851b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato tabbedPane.next(); 852b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 853b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato }); 854b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 855b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return browseButton; 856b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 857b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 858b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 859b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 860b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Creates a browse button that opens a file browser for the given text field. 861b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 862b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private JButton createBrowseButton(final JTextField textField, 863b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato final String title) 864b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 865b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JButton browseButton = new JButton(msg("browse")); 866b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato browseButton.addActionListener(new ActionListener() 867b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 868b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void actionPerformed(ActionEvent e) 869b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 870b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Update the file chooser. 871b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato fileChooser.setDialogTitle(title); 872b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato fileChooser.setSelectedFile(new File(textField.getText())); 873b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 874b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int returnVal = fileChooser.showDialog(ProGuardGUI.this, msg("ok")); 875b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (returnVal == JFileChooser.APPROVE_OPTION) 876b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 877b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Update the text field. 878b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato textField.setText(fileChooser.getSelectedFile().getPath()); 879b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 880b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 881b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato }); 882b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 883b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return browseButton; 884b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 885b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 886b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 887b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected JButton createOptimizationsButton(final JTextField textField) 888b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 889b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato final OptimizationsDialog optimizationsDialog = new OptimizationsDialog(ProGuardGUI.this); 890b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 891b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JButton optimizationsButton = new JButton(msg("select")); 892b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato optimizationsButton.addActionListener(new ActionListener() 893b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 894b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void actionPerformed(ActionEvent e) 895b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 896b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Update the dialog. 897b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato optimizationsDialog.setFilter(textField.getText()); 898b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 899b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int returnValue = optimizationsDialog.showDialog(); 900b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (returnValue == OptimizationsDialog.APPROVE_OPTION) 901b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 902b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Update the text field. 903b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato textField.setText(optimizationsDialog.getFilter()); 904b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 905b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 906b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato }); 907b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 908b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return optimizationsButton; 909b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 910b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 911b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 912b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 913b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Sets the preferred sizes of the given components to the maximum of their 914b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * current preferred sizes. 915b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 916b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private void setCommonPreferredSize(List components) 917b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 918b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Find the maximum preferred size. 919b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Dimension maximumSize = null; 920b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < components.size(); index++) 921b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 922b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JComponent component = (JComponent)components.get(index); 923b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Dimension size = component.getPreferredSize(); 924b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (maximumSize == null || 925b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato size.getWidth() > maximumSize.getWidth()) 926b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 927b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato maximumSize = size; 928b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 929b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 930b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 931b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Set the size that we found as the preferred size for all components. 932b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < components.size(); index++) 933b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 934b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JComponent component = (JComponent)components.get(index); 935b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato component.setPreferredSize(maximumSize); 936b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 937b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 938b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 939b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 940b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 941b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Updates to GUI settings to reflect the given ProGuard configuration. 942b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 943b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private void setProGuardConfiguration(Configuration configuration) 944b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 945b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Set up the input and output jars and directories. 946b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato programPanel.setClassPath(configuration.programJars); 947b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato libraryPanel.setClassPath(configuration.libraryJars); 948b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 949b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Set up the boilerplate keep options. 950b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < boilerplateKeep.length; index++) 951b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 952b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String classNames = 953b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato findMatchingKeepSpecifications(boilerplateKeep[index], 954b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.keep); 955b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 956b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boilerplateKeepCheckBoxes[index].setSelected(classNames != null); 957b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boilerplateKeepTextFields[index].setText(classNames == null ? "*" : classNames); 958b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 959b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 960b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 961b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Set up the boilerplate keep names options. 962b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < boilerplateKeepNames.length; index++) 963b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 964b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String classNames = 965b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato findMatchingKeepSpecifications(boilerplateKeepNames[index], 966b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.keep); 967b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 968b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boilerplateKeepNamesCheckBoxes[index].setSelected(classNames != null); 969b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boilerplateKeepNamesTextFields[index].setText(classNames == null ? "*" : classNames); 970b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 971b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 972b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Set up the additional keep options. Note that the matched boilerplate 973b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // options have been removed from the list. 974b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato additionalKeepPanel.setClassSpecifications(filteredKeepSpecifications(configuration.keep, 975b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false)); 976b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 977b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Set up the additional keep options. Note that the matched boilerplate 978b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // options have been removed from the list. 979b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato additionalKeepNamesPanel.setClassSpecifications(filteredKeepSpecifications(configuration.keep, 980b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true)); 981b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 982b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 983b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Set up the boilerplate "no side effect methods" options. 984b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < boilerplateNoSideEffectMethods.length; index++) 985b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 986b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boolean found = 987b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato findClassSpecification(boilerplateNoSideEffectMethods[index], 988b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.assumeNoSideEffects); 989b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 990b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boilerplateNoSideEffectMethodCheckBoxes[index].setSelected(found); 991b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 992b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 993b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Set up the additional keep options. Note that the matched boilerplate 994b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // options have been removed from the list. 995b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato additionalNoSideEffectsPanel.setClassSpecifications(configuration.assumeNoSideEffects); 996b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 997b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Set up the "why are you keeping" options. 998b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato whyAreYouKeepingPanel.setClassSpecifications(configuration.whyAreYouKeeping); 999b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1000b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Set up the other options. 1001b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato shrinkCheckBox .setSelected(configuration.shrink); 1002b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato printUsageCheckBox .setSelected(configuration.printUsage != null); 1003b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1004b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato optimizeCheckBox .setSelected(configuration.optimize); 1005b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato allowAccessModificationCheckBox .setSelected(configuration.allowAccessModification); 1006b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato mergeInterfacesAggressivelyCheckBox .setSelected(configuration.mergeInterfacesAggressively); 1007b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato optimizationPassesSpinner.getModel() .setValue(new Integer(configuration.optimizationPasses)); 1008b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1009b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscateCheckBox .setSelected(configuration.obfuscate); 1010b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato printMappingCheckBox .setSelected(configuration.printMapping != null); 1011b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato applyMappingCheckBox .setSelected(configuration.applyMapping != null); 1012b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationDictionaryCheckBox .setSelected(configuration.obfuscationDictionary != null); 1013b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato classObfuscationDictionaryCheckBox .setSelected(configuration.classObfuscationDictionary != null); 1014b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato packageObfuscationDictionaryCheckBox .setSelected(configuration.packageObfuscationDictionary != null); 1015b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato overloadAggressivelyCheckBox .setSelected(configuration.overloadAggressively); 1016b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato useUniqueClassMemberNamesCheckBox .setSelected(configuration.useUniqueClassMemberNames); 1017b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato useMixedCaseClassNamesCheckBox .setSelected(configuration.useMixedCaseClassNames); 1018b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato keepPackageNamesCheckBox .setSelected(configuration.keepPackageNames != null); 1019b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato flattenPackageHierarchyCheckBox .setSelected(configuration.flattenPackageHierarchy != null); 1020b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato repackageClassesCheckBox .setSelected(configuration.repackageClasses != null); 1021b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato keepAttributesCheckBox .setSelected(configuration.keepAttributes != null); 1022b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato newSourceFileAttributeCheckBox .setSelected(configuration.newSourceFileAttribute != null); 1023b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato adaptClassStringsCheckBox .setSelected(configuration.adaptClassStrings != null); 1024b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato adaptResourceFileNamesCheckBox .setSelected(configuration.adaptResourceFileNames != null); 1025b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato adaptResourceFileContentsCheckBox .setSelected(configuration.adaptResourceFileContents != null); 1026b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1027b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato preverifyCheckBox .setSelected(configuration.preverify); 1028b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato microEditionCheckBox .setSelected(configuration.microEdition); 1029b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato targetCheckBox .setSelected(configuration.targetClassVersion != 0); 1030b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1031b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato verboseCheckBox .setSelected(configuration.verbose); 1032b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato noteCheckBox .setSelected(configuration.note == null || !configuration.note.isEmpty()); 1033b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato warnCheckBox .setSelected(configuration.warn == null || !configuration.warn.isEmpty()); 1034b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ignoreWarningsCheckBox .setSelected(configuration.ignoreWarnings); 1035b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato skipNonPublicLibraryClassesCheckBox .setSelected(configuration.skipNonPublicLibraryClasses); 1036b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato skipNonPublicLibraryClassMembersCheckBox.setSelected(configuration.skipNonPublicLibraryClassMembers); 1037b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato keepDirectoriesCheckBox .setSelected(configuration.keepDirectories != null); 1038b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato forceProcessingCheckBox .setSelected(configuration.lastModified == Long.MAX_VALUE); 1039b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato printSeedsCheckBox .setSelected(configuration.printSeeds != null); 1040b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato printConfigurationCheckBox .setSelected(configuration.printConfiguration != null); 1041b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato dumpCheckBox .setSelected(configuration.dump != null); 1042b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1043b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato printUsageTextField .setText(fileName(configuration.printUsage)); 1044b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato optimizationsTextField .setText(configuration.optimizations == null ? OPTIMIZATIONS_DEFAULT : ListUtil.commaSeparatedString(configuration.optimizations)); 1045b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato printMappingTextField .setText(fileName(configuration.printMapping)); 1046b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato applyMappingTextField .setText(fileName(configuration.applyMapping)); 1047b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato obfuscationDictionaryTextField .setText(fileName(configuration.obfuscationDictionary)); 1048b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato keepPackageNamesTextField .setText(configuration.keepPackageNames == null ? "" : ClassUtil.externalClassName(ListUtil.commaSeparatedString(configuration.keepPackageNames))); 1049b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato flattenPackageHierarchyTextField .setText(configuration.flattenPackageHierarchy); 1050b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato repackageClassesTextField .setText(configuration.repackageClasses); 1051b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato keepAttributesTextField .setText(configuration.keepAttributes == null ? KEEP_ATTRIBUTE_DEFAULT : ListUtil.commaSeparatedString(configuration.keepAttributes)); 1052b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato newSourceFileAttributeTextField .setText(configuration.newSourceFileAttribute == null ? SOURCE_FILE_ATTRIBUTE_DEFAULT : configuration.newSourceFileAttribute); 1053b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato adaptClassStringsTextField .setText(configuration.adaptClassStrings == null ? "" : ClassUtil.externalClassName(ListUtil.commaSeparatedString(configuration.adaptClassStrings))); 1054b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato adaptResourceFileNamesTextField .setText(configuration.adaptResourceFileNames == null ? ADAPT_RESOURCE_FILE_NAMES_DEFAULT : ListUtil.commaSeparatedString(configuration.adaptResourceFileNames)); 1055b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato adaptResourceFileContentsTextField .setText(configuration.adaptResourceFileContents == null ? ADAPT_RESOURCE_FILE_CONTENTS_DEFAULT : ListUtil.commaSeparatedString(configuration.adaptResourceFileContents)); 1056b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato noteTextField .setText(ListUtil.commaSeparatedString(configuration.note)); 1057b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato warnTextField .setText(ListUtil.commaSeparatedString(configuration.warn)); 1058b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato keepDirectoriesTextField .setText(ListUtil.commaSeparatedString(configuration.keepDirectories)); 1059b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato printSeedsTextField .setText(fileName(configuration.printSeeds)); 1060b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato printConfigurationTextField .setText(fileName(configuration.printConfiguration)); 1061b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato dumpTextField .setText(fileName(configuration.dump)); 1062b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1063b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (configuration.targetClassVersion != 0) 1064b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1065b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato targetComboBox.setSelectedItem(ClassUtil.externalClassVersion(configuration.targetClassVersion)); 1066b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1067b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato else 1068b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1069b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato targetComboBox.setSelectedIndex(targetComboBox.getItemCount() - 1); 1070b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1071b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1072b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (configuration.printMapping != null) 1073b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1074b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato reTraceMappingTextField.setText(fileName(configuration.printMapping)); 1075b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1076b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1077b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1078b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1079b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 1080b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the ProGuard configuration that reflects the current GUI settings. 1081b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 1082b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private Configuration getProGuardConfiguration() 1083b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1084b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Configuration configuration = new Configuration(); 1085b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1086b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Get the input and output jars and directories. 1087b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.programJars = programPanel.getClassPath(); 1088b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.libraryJars = libraryPanel.getClassPath(); 1089b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1090b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato List keep = new ArrayList(); 1091b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1092b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Collect the additional keep options. 1093b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato List additionalKeep = additionalKeepPanel.getClassSpecifications(); 1094b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (additionalKeep != null) 1095b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1096b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato keep.addAll(additionalKeep); 1097b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1098b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1099b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Collect the additional keep names options. 1100b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato List additionalKeepNames = additionalKeepNamesPanel.getClassSpecifications(); 1101b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (additionalKeepNames != null) 1102b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1103b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato keep.addAll(additionalKeepNames); 1104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Collect the boilerplate keep options. 1107b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < boilerplateKeep.length; index++) 1108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (boilerplateKeepCheckBoxes[index].isSelected()) 1110b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato keep.add(classSpecification(boilerplateKeep[index], 1112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boilerplateKeepTextFields[index].getText())); 1113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Collect the boilerplate keep names options. 1117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < boilerplateKeepNames.length; index++) 1118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (boilerplateKeepNamesCheckBoxes[index].isSelected()) 1120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato keep.add(classSpecification(boilerplateKeepNames[index], 1122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boilerplateKeepNamesTextFields[index].getText())); 1123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1125b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1126b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Put the list of keep specifications in the configuration. 1127b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (keep.size() > 0) 1128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.keep = keep; 1130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Collect the boilerplate "no side effect methods" options. 1134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato List noSideEffectMethods = new ArrayList(); 1135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < boilerplateNoSideEffectMethods.length; index++) 1137b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1138b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (boilerplateNoSideEffectMethodCheckBoxes[index].isSelected()) 1139b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1140b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato noSideEffectMethods.add(boilerplateNoSideEffectMethods[index]); 1141b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1143b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1144b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Collect the additional "no side effect methods" options. 1145b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato List additionalNoSideEffectOptions = additionalNoSideEffectsPanel.getClassSpecifications(); 1146b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (additionalNoSideEffectOptions != null) 1147b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1148b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato noSideEffectMethods.addAll(additionalNoSideEffectOptions); 1149b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1150b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1151b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Put the list of "no side effect methods" options in the configuration. 1152b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (noSideEffectMethods.size() > 0) 1153b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1154b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.assumeNoSideEffects = noSideEffectMethods; 1155b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1156b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1157b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1158b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Collect the "why are you keeping" options. 1159b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.whyAreYouKeeping = whyAreYouKeepingPanel.getClassSpecifications(); 1160b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1161b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1162b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Get the other options. 1163b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.shrink = shrinkCheckBox .isSelected(); 1164b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.printUsage = printUsageCheckBox .isSelected() ? new File(printUsageTextField .getText()) : null; 1165b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1166b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.optimize = optimizeCheckBox .isSelected(); 1167b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.allowAccessModification = allowAccessModificationCheckBox .isSelected(); 1168b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.mergeInterfacesAggressively = mergeInterfacesAggressivelyCheckBox .isSelected(); 1169b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.optimizations = optimizationsTextField.getText().length() > 1 ? ListUtil.commaSeparatedList(optimizationsTextField .getText()) : null; 1170b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.optimizationPasses = ((SpinnerNumberModel)optimizationPassesSpinner.getModel()).getNumber().intValue(); 1171b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1172b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.obfuscate = obfuscateCheckBox .isSelected(); 1173b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.printMapping = printMappingCheckBox .isSelected() ? new File(printMappingTextField .getText()) : null; 1174b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.applyMapping = applyMappingCheckBox .isSelected() ? new File(applyMappingTextField .getText()) : null; 1175b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.obfuscationDictionary = obfuscationDictionaryCheckBox .isSelected() ? new File(obfuscationDictionaryTextField .getText()) : null; 1176b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.classObfuscationDictionary = classObfuscationDictionaryCheckBox .isSelected() ? new File(classObfuscationDictionaryTextField .getText()) : null; 1177b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.packageObfuscationDictionary = packageObfuscationDictionaryCheckBox .isSelected() ? new File(packageObfuscationDictionaryTextField .getText()) : null; 1178b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.overloadAggressively = overloadAggressivelyCheckBox .isSelected(); 1179b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.useUniqueClassMemberNames = useUniqueClassMemberNamesCheckBox .isSelected(); 1180b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.useMixedCaseClassNames = useMixedCaseClassNamesCheckBox .isSelected(); 1181b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.keepPackageNames = keepPackageNamesCheckBox .isSelected() ? keepPackageNamesTextField.getText().length() > 0 ? ListUtil.commaSeparatedList(ClassUtil.internalClassName(keepPackageNamesTextField.getText())) : new ArrayList() : null; 1182b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.flattenPackageHierarchy = flattenPackageHierarchyCheckBox .isSelected() ? ClassUtil.internalClassName(flattenPackageHierarchyTextField .getText()) : null; 1183b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.repackageClasses = repackageClassesCheckBox .isSelected() ? ClassUtil.internalClassName(repackageClassesTextField .getText()) : null; 1184b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.keepAttributes = keepAttributesCheckBox .isSelected() ? ListUtil.commaSeparatedList(keepAttributesTextField .getText()) : null; 1185b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.newSourceFileAttribute = newSourceFileAttributeCheckBox .isSelected() ? newSourceFileAttributeTextField .getText() : null; 1186b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.adaptClassStrings = adaptClassStringsCheckBox .isSelected() ? adaptClassStringsTextField.getText().length() > 0 ? ListUtil.commaSeparatedList(ClassUtil.internalClassName(adaptClassStringsTextField.getText())) : new ArrayList() : null; 1187b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.adaptResourceFileNames = adaptResourceFileNamesCheckBox .isSelected() ? ListUtil.commaSeparatedList(adaptResourceFileNamesTextField .getText()) : null; 1188b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.adaptResourceFileContents = adaptResourceFileContentsCheckBox .isSelected() ? ListUtil.commaSeparatedList(adaptResourceFileContentsTextField .getText()) : null; 1189b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1190b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.preverify = preverifyCheckBox .isSelected(); 1191b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.microEdition = microEditionCheckBox .isSelected(); 1192b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.targetClassVersion = targetCheckBox .isSelected() ? ClassUtil.internalClassVersion(targetComboBox.getSelectedItem().toString()) : 0; 1193b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1194b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.verbose = verboseCheckBox .isSelected(); 1195b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.note = noteCheckBox .isSelected() ? noteTextField.getText().length() > 0 ? ListUtil.commaSeparatedList(ClassUtil.internalClassName(noteTextField.getText())) : null : new ArrayList(); 1196b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.warn = warnCheckBox .isSelected() ? warnTextField.getText().length() > 0 ? ListUtil.commaSeparatedList(ClassUtil.internalClassName(warnTextField.getText())) : null : new ArrayList(); 1197b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.ignoreWarnings = ignoreWarningsCheckBox .isSelected(); 1198b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.skipNonPublicLibraryClasses = skipNonPublicLibraryClassesCheckBox .isSelected(); 1199b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.skipNonPublicLibraryClassMembers = skipNonPublicLibraryClassMembersCheckBox.isSelected(); 1200b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.keepDirectories = keepDirectoriesCheckBox .isSelected() ? keepDirectoriesTextField.getText().length() > 0 ? ListUtil.commaSeparatedList(ClassUtil.internalClassName(keepDirectoriesTextField.getText())) : new ArrayList() : null; 1201b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.lastModified = forceProcessingCheckBox .isSelected() ? Long.MAX_VALUE : System.currentTimeMillis(); 1202b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.printSeeds = printSeedsCheckBox .isSelected() ? new File(printSeedsTextField .getText()) : null; 1203b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.printConfiguration = printConfigurationCheckBox .isSelected() ? new File(printConfigurationTextField .getText()) : null; 1204b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configuration.dump = dumpCheckBox .isSelected() ? new File(dumpTextField .getText()) : null; 1205b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1206b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return configuration; 1207b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1208b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1209b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1210b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 1211b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Looks in the given list for a class specification that is identical to 1212b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * the given template. Returns true if it is found, and removes the matching 1213b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * class specification as a side effect. 1214b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 1215b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private boolean findClassSpecification(ClassSpecification classSpecificationTemplate, 1216b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato List classSpecifications) 1217b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1218b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (classSpecifications == null) 1219b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1220b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return false; 1221b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1222b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1223b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < classSpecifications.size(); index++) 1224b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1225b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (classSpecificationTemplate.equals(classSpecifications.get(index))) 1226b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1227b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Remove the matching option as a side effect. 1228b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato classSpecifications.remove(index); 1229b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1230b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return true; 1231b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1232b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1233b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1234b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return false; 1235b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1236b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1237b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1238b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 1239b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the subset of the given list of keep specifications, with 1240b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * matching shrinking flag. 1241b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 1242b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private List filteredKeepSpecifications(List keepSpecifications, 1243b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boolean allowShrinking) 1244b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1245b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato List filteredKeepSpecifications = new ArrayList(); 1246b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1247b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < keepSpecifications.size(); index++) 1248b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1249b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato KeepClassSpecification keepClassSpecification = 1250b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato (KeepClassSpecification)keepSpecifications.get(index); 1251b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1252b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (keepClassSpecification.allowShrinking == allowShrinking) 1253b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1254b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato filteredKeepSpecifications.add(keepClassSpecification); 1255b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1256b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1257b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1258b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return filteredKeepSpecifications; 1259b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1260b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1261b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1262b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 1263b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Looks in the given list for keep specifications that match the given 1264b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * template. Returns a comma-separated string of class names from 1265b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * matching keep specifications, and removes the matching keep 1266b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * specifications as a side effect. 1267b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 1268b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private String findMatchingKeepSpecifications(KeepClassSpecification keepClassSpecificationTemplate, 1269b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato List keepSpecifications) 1270b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1271b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (keepSpecifications == null) 1272b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1273b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return null; 1274b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1275b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1276b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato StringBuffer buffer = null; 1277b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1278b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < keepSpecifications.size(); index++) 1279b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1280b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato KeepClassSpecification listedKeepClassSpecification = 1281b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato (KeepClassSpecification)keepSpecifications.get(index); 1282b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String className = listedKeepClassSpecification.className; 1283b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato keepClassSpecificationTemplate.className = className; 1284b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (keepClassSpecificationTemplate.equals(listedKeepClassSpecification)) 1285b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1286b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (buffer == null) 1287b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1288b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato buffer = new StringBuffer(); 1289b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1290b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato else 1291b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1292b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato buffer.append(','); 1293b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1294b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato buffer.append(className == null ? "*" : ClassUtil.externalClassName(className)); 1295b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1296b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Remove the matching option as a side effect. 1297b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato keepSpecifications.remove(index--); 1298b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1299b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1300b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1301b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return buffer == null ? null : buffer.toString(); 1302b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1303b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1304b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1305b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 1306b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns a class specification or keep specification, based on the given 1307b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * template and the class name to be filled in. 1308b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 1309b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private ClassSpecification classSpecification(ClassSpecification classSpecificationTemplate, 1310b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String className) 1311b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1312b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Create a copy of the template. 1313b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ClassSpecification classSpecification = 1314b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato (ClassSpecification)classSpecificationTemplate.clone(); 1315b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1316b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Set the class name in the copy. 1317b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato classSpecification.className = 1318b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato className.equals("") || 1319b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato className.equals("*") ? 1320b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato null : 1321b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ClassUtil.internalClassName(className); 1322b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1323b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Return the modified copy. 1324b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return classSpecification; 1325b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1326b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1327b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1328b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Methods and internal classes related to actions. 1329b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1330b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 1331b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Loads the given ProGuard configuration into the GUI. 1332b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 1333b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private void loadConfiguration(File file) 1334b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1335b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Set the default directory and file in the file choosers. 1336b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configurationChooser.setSelectedFile(file.getAbsoluteFile()); 1337b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato fileChooser.setCurrentDirectory(file.getAbsoluteFile().getParentFile()); 1338b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1339b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato try 1340b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1341b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Parse the configuration file. 1342b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ConfigurationParser parser = new ConfigurationParser(file); 1343b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Configuration configuration = new Configuration(); 1344b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1345b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato try 1346b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1347b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato parser.parse(configuration); 1348b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1349b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Let the GUI reflect the configuration. 1350b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato setProGuardConfiguration(configuration); 1351b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1352b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato catch (ParseException ex) 1353b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1354b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JOptionPane.showMessageDialog(getContentPane(), 1355b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato msg("cantParseConfigurationFile", file.getPath()), 1356b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato msg("warning"), 1357b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JOptionPane.ERROR_MESSAGE); 1358b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1359b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato finally 1360b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1361b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato parser.close(); 1362b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1363b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1364b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato catch (IOException ex) 1365b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1366b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JOptionPane.showMessageDialog(getContentPane(), 1367b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato msg("cantOpenConfigurationFile", file.getPath()), 1368b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato msg("warning"), 1369b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JOptionPane.ERROR_MESSAGE); 1370b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1371b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1372b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1373b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1374b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 1375b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Loads the given ProGuard configuration into the GUI. 1376b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 1377b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private void loadConfiguration(URL url) 1378b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1379b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato try 1380b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1381b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Parse the configuration file. 1382b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ConfigurationParser parser = new ConfigurationParser(url); 1383b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Configuration configuration = new Configuration(); 1384b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1385b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato try 1386b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1387b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato parser.parse(configuration); 1388b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1389b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Let the GUI reflect the configuration. 1390b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato setProGuardConfiguration(configuration); 1391b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1392b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato catch (ParseException ex) 1393b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1394b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JOptionPane.showMessageDialog(getContentPane(), 1395b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato msg("cantParseConfigurationFile", url), 1396b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato msg("warning"), 1397b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JOptionPane.ERROR_MESSAGE); 1398b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1399b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato finally 1400b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1401b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato parser.close(); 1402b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1403b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1404b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato catch (IOException ex) 1405b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1406b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JOptionPane.showMessageDialog(getContentPane(), 1407b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato msg("cantOpenConfigurationFile", url), 1408b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato msg("warning"), 1409b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JOptionPane.ERROR_MESSAGE); 1410b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1411b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1412b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1413b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1414b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 1415b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Saves the current ProGuard configuration to the given file. 1416b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 1417b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private void saveConfiguration(File file) 1418b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1419b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato try 1420b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1421b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Save the configuration file. 1422b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ConfigurationWriter writer = new ConfigurationWriter(file); 1423b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.write(getProGuardConfiguration()); 1424b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.close(); 1425b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1426b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato catch (Exception ex) 1427b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1428b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JOptionPane.showMessageDialog(getContentPane(), 1429b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato msg("cantSaveConfigurationFile", file.getPath()), 1430b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato msg("warning"), 1431b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JOptionPane.ERROR_MESSAGE); 1432b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1433b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1434b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1435b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1436b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 1437b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Loads the given stack trace into the GUI. 1438b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 1439b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private void loadStackTrace(String fileName) 1440b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1441b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato try 1442b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1443b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato StringBuffer buffer = new StringBuffer(1024); 1444b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1445b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Reader reader = new BufferedReader(new FileReader(fileName)); 1446b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato try 1447b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1448b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato while (true) 1449b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1450b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int c = reader.read(); 1451b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (c < 0) 1452b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1453b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato break; 1454b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1455b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1456b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato buffer.append(c); 1457b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1458b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1459b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato finally 1460b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1461b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato reader.close(); 1462b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1463b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1464b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Put the stack trace in the text area. 1465b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato stackTraceTextArea.setText(buffer.toString()); 1466b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1467b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato catch (IOException ex) 1468b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1469b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JOptionPane.showMessageDialog(getContentPane(), 1470b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato msg("cantOpenStackTraceFile", fileName), 1471b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato msg("warning"), 1472b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato JOptionPane.ERROR_MESSAGE); 1473b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1474b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1475b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1476b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1477b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 1478b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This ActionListener loads a ProGuard configuration file and initializes 1479b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * the GUI accordingly. 1480b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 1481b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private class MyLoadConfigurationActionListener implements ActionListener 1482b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1483b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void actionPerformed(ActionEvent e) 1484b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1485b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configurationChooser.setDialogTitle(msg("selectConfigurationFile")); 1486b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1487b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int returnValue = configurationChooser.showOpenDialog(ProGuardGUI.this); 1488b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (returnValue == JFileChooser.APPROVE_OPTION) 1489b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1490b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato loadConfiguration(configurationChooser.getSelectedFile()); 1491b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1492b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1493b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1494b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1495b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1496b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 1497b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This ActionListener saves a ProGuard configuration file based on the 1498b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * current GUI settings. 1499b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 1500b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private class MySaveConfigurationActionListener implements ActionListener 1501b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1502b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void actionPerformed(ActionEvent e) 1503b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1504b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configurationChooser.setDialogTitle(msg("saveConfigurationFile")); 1505b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1506b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int returnVal = configurationChooser.showSaveDialog(ProGuardGUI.this); 1507b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (returnVal == JFileChooser.APPROVE_OPTION) 1508b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1509b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato saveConfiguration(configurationChooser.getSelectedFile()); 1510b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1511b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1512b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1513b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1514b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1515b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 1516b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This ActionListener displays the ProGuard configuration specified by the 1517b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * current GUI settings. 1518b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 1519b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private class MyViewConfigurationActionListener implements ActionListener 1520b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1521b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void actionPerformed(ActionEvent e) 1522b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1523b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Make sure System.out has not been redirected yet. 1524b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (!systemOutRedirected) 1525b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1526b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato consoleTextArea.setText(""); 1527b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1528b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato TextAreaOutputStream outputStream = 1529b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new TextAreaOutputStream(consoleTextArea); 1530b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1531b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato try 1532b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1533b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // TODO: write out relative path names and path names with system properties. 1534b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1535b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Write the configuration. 1536b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ConfigurationWriter writer = new ConfigurationWriter(outputStream); 1537b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato try 1538b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1539b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.write(getProGuardConfiguration()); 1540b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1541b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato finally 1542b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1543b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writer.close(); 1544b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1545b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1546b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato catch (IOException ex) 1547b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1548b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // This shouldn't happen. 1549b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1550b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1551b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Scroll to the top of the configuration. 1552b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato consoleTextArea.setCaretPosition(0); 1553b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1554b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1555b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1556b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1557b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1558b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 1559b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This ActionListener executes ProGuard based on the current GUI settings. 1560b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 1561b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private class MyProcessActionListener implements ActionListener 1562b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1563b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void actionPerformed(ActionEvent e) 1564b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1565b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Make sure System.out has not been redirected yet. 1566b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (!systemOutRedirected) 1567b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1568b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato systemOutRedirected = true; 1569b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1570b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Get the informational configuration file name. 1571b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato File configurationFile = configurationChooser.getSelectedFile(); 1572b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String configurationFileName = configurationFile != null ? 1573b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configurationFile.getName() : 1574b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato msg("sampleConfigurationFileName"); 1575b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1576b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Create the ProGuard thread. 1577b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Thread proGuardThread = 1578b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new Thread(new ProGuardRunnable(consoleTextArea, 1579b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato getProGuardConfiguration(), 1580b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato configurationFileName)); 1581b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1582b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Run it. 1583b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato proGuardThread.start(); 1584b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1585b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1586b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1587b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1588b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1589b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 1590b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This ActionListener loads an obfuscated stack trace from a file and puts 1591b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * it in the proper text area. 1592b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 1593b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private class MyLoadStackTraceActionListener implements ActionListener 1594b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1595b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void actionPerformed(ActionEvent e) 1596b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1597b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato fileChooser.setDialogTitle(msg("selectStackTraceFile")); 1598b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato fileChooser.setSelectedFile(null); 1599b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1600b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int returnValue = fileChooser.showOpenDialog(ProGuardGUI.this); 1601b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (returnValue == JFileChooser.APPROVE_OPTION) 1602b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1603b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato File selectedFile = fileChooser.getSelectedFile(); 1604b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String fileName = selectedFile.getPath(); 1605b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1606b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato loadStackTrace(fileName); 1607b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1608b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1609b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1610b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1611b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1612b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 1613b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This ActionListener executes ReTrace based on the current GUI settings. 1614b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 1615b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private class MyReTraceActionListener implements ActionListener 1616b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1617b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void actionPerformed(ActionEvent e) 1618b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1619b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Make sure System.out has not been redirected yet. 1620b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (!systemOutRedirected) 1621b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1622b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato systemOutRedirected = true; 1623b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1624b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato boolean verbose = reTraceVerboseCheckBox.isSelected(); 1625b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato File retraceMappingFile = new File(reTraceMappingTextField.getText()); 1626b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String stackTrace = stackTraceTextArea.getText(); 1627b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1628b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Create the ReTrace runnable. 1629b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Runnable reTraceRunnable = new ReTraceRunnable(reTraceTextArea, 1630b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato verbose, 1631b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato retraceMappingFile, 1632b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato stackTrace); 1633b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1634b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Run it in this thread, because it won't take long anyway. 1635b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato reTraceRunnable.run(); 1636b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1637b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1638b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1639b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1640b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1641b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Small utility methods. 1642b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1643b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 1644b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the file name of the given file, if any. 1645b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 1646b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private static String fileName(File file) 1647b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1648b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return file == null ? "" : file.getAbsolutePath(); 1649b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1650b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1651b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1652b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 1653b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Attaches the tool tip from the GUI resources that corresponds to the 1654b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * given key, to the given component. 1655b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 1656b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private static JComponent tip(JComponent component, String messageKey) 1657b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1658b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato component.setToolTipText(msg(messageKey)); 1659b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1660b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return component; 1661b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1662b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1663b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1664b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 1665b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the message from the GUI resources that corresponds to the given 1666b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * key. 1667b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 1668b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private static String msg(String messageKey) 1669b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1670b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return GUIResources.getMessage(messageKey); 1671b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1672b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1673b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1674b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 1675b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the message from the GUI resources that corresponds to the given 1676b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * key and argument. 1677b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 1678b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private String msg(String messageKey, 1679b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Object messageArgument) 1680b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1681b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return GUIResources.getMessage(messageKey, new Object[] {messageArgument}); 1682b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1683b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1684b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1685b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 1686b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * The main method for the ProGuard GUI. 1687b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 1688b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static void main(final String[] args) 1689b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1690b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato try 1691b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1692b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato SwingUtil.invokeAndWait(new Runnable() 1693b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1694b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void run() 1695b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1696b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ProGuardGUI gui = new ProGuardGUI(); 1697b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato gui.pack(); 1698b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1699b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 1700b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Dimension guiSize = gui.getSize(); 1701b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato gui.setLocation((screenSize.width - guiSize.width) / 2, 1702b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato (screenSize.height - guiSize.height) / 2); 1703b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato gui.show(); 1704b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1705b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Start the splash animation, unless specified otherwise. 1706b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int argIndex = 0; 1707b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (argIndex < args.length && 1708b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato NO_SPLASH_OPTION.startsWith(args[argIndex])) 1709b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1710b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato gui.skipSplash(); 1711b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato argIndex++; 1712b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1713b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato else 1714b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1715b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato gui.startSplash(); 1716b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1717b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1718b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Load an initial configuration, if specified. 1719b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (argIndex < args.length) 1720b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1721b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato gui.loadConfiguration(new File(args[argIndex])); 1722b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato argIndex++; 1723b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1724b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1725b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (argIndex < args.length) 1726b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1727b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato System.out.println(gui.getClass().getName() + ": ignoring extra arguments [" + args[argIndex] + "...]"); 1728b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1729b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1730b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1731b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato }); 1732b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1733b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato catch (Exception e) 1734b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1735b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Nothing. 1736b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1737b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1738b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato} 1739