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