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