blob: 044c33846b661cc1b1c6ff80315f76885538ce89 [file] [log] [blame]
/*
* 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);
}
}