/* * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * * Copyright (c) 2002-2010 Eric Lafortune (eric@graphics.cornell.edu) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 2 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package proguard.gui; import proguard.optimize.Optimizer; import proguard.util.*; import javax.swing.*; import javax.swing.border.*; import java.awt.*; import java.awt.event.*; /** * This <code>JDialog</code> allows the user to enter a String. * * @author Eric Lafortune */ final class OptimizationsDialog extends JDialog { /** * Return value if the dialog is canceled (with the Cancel button or by * closing the dialog window). */ public static final int CANCEL_OPTION = 1; /** * Return value if the dialog is approved (with the Ok button). */ public static final int APPROVE_OPTION = 0; private final JCheckBox[] optimizationCheckBoxes = new JCheckBox[Optimizer.OPTIMIZATION_NAMES.length]; private int returnValue; public OptimizationsDialog(JFrame owner) { super(owner, msg("selectOptimizations"), true); setResizable(true); // Create some constraints that can be reused. GridBagConstraints constraintsLast = new GridBagConstraints(); constraintsLast.gridwidth = GridBagConstraints.REMAINDER; constraintsLast.anchor = GridBagConstraints.WEST; constraintsLast.insets = new Insets(1, 2, 1, 2); GridBagConstraints constraintsLastStretch = new GridBagConstraints(); constraintsLastStretch.gridwidth = GridBagConstraints.REMAINDER; constraintsLastStretch.fill = GridBagConstraints.HORIZONTAL; constraintsLastStretch.weightx = 1.0; constraintsLastStretch.anchor = GridBagConstraints.WEST; constraintsLastStretch.insets = constraintsLast.insets; GridBagConstraints panelConstraints = new GridBagConstraints(); panelConstraints.gridwidth = GridBagConstraints.REMAINDER; panelConstraints.fill = GridBagConstraints.HORIZONTAL; panelConstraints.weightx = 1.0; panelConstraints.weighty = 0.0; panelConstraints.anchor = GridBagConstraints.NORTHWEST; panelConstraints.insets = constraintsLast.insets; GridBagConstraints selectButtonConstraints = new GridBagConstraints(); selectButtonConstraints.weighty = 1.0; selectButtonConstraints.anchor = GridBagConstraints.SOUTHWEST; selectButtonConstraints.insets = new Insets(4, 4, 8, 4); GridBagConstraints okButtonConstraints = new GridBagConstraints(); okButtonConstraints.weightx = 1.0; okButtonConstraints.weighty = 1.0; okButtonConstraints.anchor = GridBagConstraints.SOUTHEAST; okButtonConstraints.insets = selectButtonConstraints.insets; GridBagConstraints cancelButtonConstraints = new GridBagConstraints(); cancelButtonConstraints.gridwidth = GridBagConstraints.REMAINDER; cancelButtonConstraints.weighty = 1.0; cancelButtonConstraints.anchor = GridBagConstraints.SOUTHEAST; cancelButtonConstraints.insets = selectButtonConstraints.insets; GridBagLayout layout = new GridBagLayout(); Border etchedBorder = BorderFactory.createEtchedBorder(EtchedBorder.RAISED); // Create the optimizations panel. JPanel optimizationsPanel = new JPanel(layout); JPanel optimizationSubpanel = null; String lastOptimizationPrefix = null; for (int index = 0; index < Optimizer.OPTIMIZATION_NAMES.length; index++) { String optimizationName = Optimizer.OPTIMIZATION_NAMES[index]; String optimizationPrefix = optimizationName.substring(0, optimizationName.indexOf('/')); if (optimizationSubpanel == null || !optimizationPrefix.equals(lastOptimizationPrefix)) { // Create a new keep subpanel and add it. optimizationSubpanel = new JPanel(layout); optimizationSubpanel.setBorder(BorderFactory.createTitledBorder(etchedBorder, msg(optimizationPrefix))); optimizationsPanel.add(optimizationSubpanel, panelConstraints); lastOptimizationPrefix = optimizationPrefix; } JCheckBox optimizationCheckBox = new JCheckBox(optimizationName); optimizationCheckBoxes[index] = optimizationCheckBox; optimizationSubpanel.add(tip(optimizationCheckBox, optimizationName.replace('/', '_')+"Tip"), constraintsLastStretch); } // Create the Select All button. JButton selectAllButton = new JButton(msg("selectAll")); selectAllButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { for (int index = 0; index < optimizationCheckBoxes.length; index++) { optimizationCheckBoxes[index].setSelected(true); } } }); // Create the Select All button. JButton selectNoneButton = new JButton(msg("selectNone")); selectNoneButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { for (int index = 0; index < optimizationCheckBoxes.length; index++) { optimizationCheckBoxes[index].setSelected(false); } } }); // Create the Ok button. JButton okButton = new JButton(msg("ok")); okButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { returnValue = APPROVE_OPTION; hide(); } }); // Create the Cancel button. JButton cancelButton = new JButton(msg("cancel")); cancelButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { hide(); } }); // Add all panels to the main panel. optimizationsPanel.add(selectAllButton, selectButtonConstraints); optimizationsPanel.add(selectNoneButton, selectButtonConstraints); optimizationsPanel.add(okButton, okButtonConstraints); optimizationsPanel.add(cancelButton, cancelButtonConstraints); getContentPane().add(new JScrollPane(optimizationsPanel)); } /** * Sets the initial optimization filter to be used by the dialog. */ public void setFilter(String optimizations) { StringMatcher filter = optimizations != null && optimizations.length() > 0 ? new ListParser(new NameParser()).parse(optimizations) : new FixedStringMatcher(""); for (int index = 0; index < Optimizer.OPTIMIZATION_NAMES.length; index++) { optimizationCheckBoxes[index].setSelected(filter.matches(Optimizer.OPTIMIZATION_NAMES[index])); } } /** * Returns the optimization filter composed from the settings in the dialog. */ public String getFilter() { return new FilterBuilder(optimizationCheckBoxes, '/').buildFilter(); } /** * Shows this dialog. This method only returns when the dialog is closed. * * @return <code>CANCEL_OPTION</code> or <code>APPROVE_OPTION</code>, * depending on the choice of the user. */ public int showDialog() { returnValue = CANCEL_OPTION; // Open the dialog in the right place, then wait for it to be closed, // one way or another. pack(); setLocationRelativeTo(getOwner()); show(); return returnValue; } /** * Attaches the tool tip from the GUI resources that corresponds to the * given key, to the given component. */ private static JComponent tip(JComponent component, String messageKey) { component.setToolTipText(msg(messageKey)); return component; } /** * Returns the message from the GUI resources that corresponds to the given * key. */ private static String msg(String messageKey) { return GUIResources.getMessage(messageKey); } }