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