| /* |
| * ProGuard -- shrinking, optimization, obfuscation, and preverification |
| * of Java bytecode. |
| * |
| * Copyright (c) 2002-2009 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); |
| } |
| } |