/* * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * * Copyright (c) 2002-2014 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.util.ListUtil; import javax.swing.*; import javax.swing.border.*; import java.awt.*; import java.awt.event.*; import java.util.List; /** * This JDialog allows the user to enter a String. * * @author Eric Lafortune */ public class FilterDialog 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 static final String DEFAULT_FILTER = "**"; private static final String DEFAULT_APK_FILTER = "**.apk"; private static final String DEFAULT_JAR_FILTER = "**.jar"; private static final String DEFAULT_AAR_FILTER = "**.aar"; private static final String DEFAULT_WAR_FILTER = "**.war"; private static final String DEFAULT_EAR_FILTER = "**.ear"; private static final String DEFAULT_ZIP_FILTER = "**.zip"; private final JTextField filterTextField = new JTextField(40); private final JTextField apkFilterTextField = new JTextField(40); private final JTextField jarFilterTextField = new JTextField(40); private final JTextField aarFilterTextField = new JTextField(40); private final JTextField warFilterTextField = new JTextField(40); private final JTextField earFilterTextField = new JTextField(40); private final JTextField zipFilterTextField = new JTextField(40); private int returnValue; public FilterDialog(JFrame owner, String explanation) { super(owner, true); setResizable(true); // Create some constraints that can be reused. GridBagConstraints textConstraints = new GridBagConstraints(); textConstraints.gridwidth = GridBagConstraints.REMAINDER; textConstraints.fill = GridBagConstraints.HORIZONTAL; textConstraints.weightx = 1.0; textConstraints.weighty = 1.0; textConstraints.anchor = GridBagConstraints.NORTHWEST; textConstraints.insets = new Insets(10, 10, 10, 10); GridBagConstraints labelConstraints = new GridBagConstraints(); labelConstraints.anchor = GridBagConstraints.WEST; labelConstraints.insets = new Insets(1, 2, 1, 2); GridBagConstraints textFieldConstraints = new GridBagConstraints(); textFieldConstraints.gridwidth = GridBagConstraints.REMAINDER; textFieldConstraints.fill = GridBagConstraints.HORIZONTAL; textFieldConstraints.weightx = 1.0; textFieldConstraints.anchor = GridBagConstraints.WEST; textFieldConstraints.insets = labelConstraints.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 = labelConstraints.insets; GridBagConstraints okButtonConstraints = new GridBagConstraints(); okButtonConstraints.weightx = 1.0; okButtonConstraints.weighty = 1.0; okButtonConstraints.anchor = GridBagConstraints.SOUTHEAST; okButtonConstraints.insets = new Insets(4, 4, 8, 4); GridBagConstraints cancelButtonConstraints = new GridBagConstraints(); cancelButtonConstraints.gridwidth = GridBagConstraints.REMAINDER; cancelButtonConstraints.weighty = 1.0; cancelButtonConstraints.anchor = GridBagConstraints.SOUTHEAST; cancelButtonConstraints.insets = okButtonConstraints.insets; GridBagLayout layout = new GridBagLayout(); Border etchedBorder = BorderFactory.createEtchedBorder(EtchedBorder.RAISED); // Create the panel with the explanation. JTextArea explanationTextArea = new JTextArea(explanation, 3, 0); explanationTextArea.setOpaque(false); explanationTextArea.setEditable(false); explanationTextArea.setLineWrap(true); explanationTextArea.setWrapStyleWord(true); // Create the filter labels. JLabel filterLabel = new JLabel(msg("nameFilter")); JLabel apkFilterLabel = new JLabel(msg("apkNameFilter")); JLabel jarFilterLabel = new JLabel(msg("jarNameFilter")); JLabel aarFilterLabel = new JLabel(msg("aarNameFilter")); JLabel warFilterLabel = new JLabel(msg("warNameFilter")); JLabel earFilterLabel = new JLabel(msg("earNameFilter")); JLabel zipFilterLabel = new JLabel(msg("zipNameFilter")); // Create the filter panel. JPanel filterPanel = new JPanel(layout); filterPanel.setBorder(BorderFactory.createTitledBorder(etchedBorder, msg("filters"))); filterPanel.add(explanationTextArea, textConstraints); filterPanel.add(tip(filterLabel, "nameFilterTip"), labelConstraints); filterPanel.add(tip(filterTextField, "fileNameFilterTip"), textFieldConstraints); filterPanel.add(tip(apkFilterLabel, "apkNameFilterTip"), labelConstraints); filterPanel.add(tip(apkFilterTextField, "fileNameFilterTip"), textFieldConstraints); filterPanel.add(tip(jarFilterLabel, "jarNameFilterTip"), labelConstraints); filterPanel.add(tip(jarFilterTextField, "fileNameFilterTip"), textFieldConstraints); filterPanel.add(tip(aarFilterLabel, "aarNameFilterTip"), labelConstraints); filterPanel.add(tip(aarFilterTextField, "fileNameFilterTip"), textFieldConstraints); filterPanel.add(tip(warFilterLabel, "warNameFilterTip"), labelConstraints); filterPanel.add(tip(warFilterTextField, "fileNameFilterTip"), textFieldConstraints); filterPanel.add(tip(earFilterLabel, "earNameFilterTip"), labelConstraints); filterPanel.add(tip(earFilterTextField, "fileNameFilterTip"), textFieldConstraints); filterPanel.add(tip(zipFilterLabel, "zipNameFilterTip"), labelConstraints); filterPanel.add(tip(zipFilterTextField, "fileNameFilterTip"), textFieldConstraints); JButton okButton = new JButton(msg("ok")); okButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { returnValue = APPROVE_OPTION; hide(); } }); JButton cancelButton = new JButton(msg("cancel")); cancelButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { hide(); } }); // Add all panels to the main panel. JPanel mainPanel = new JPanel(layout); mainPanel.add(filterPanel, panelConstraints); mainPanel.add(okButton, okButtonConstraints); mainPanel.add(cancelButton, cancelButtonConstraints); getContentPane().add(mainPanel); } /** * Sets the filter to be represented in this dialog. */ public void setFilter(List filter) { filterTextField.setText(filter != null ? ListUtil.commaSeparatedString(filter, true) : DEFAULT_FILTER); } /** * Returns the filter currently represented in this dialog. */ public List getFilter() { String filter = filterTextField.getText(); return filter.equals(DEFAULT_FILTER) ? null : ListUtil.commaSeparatedList(filter); } /** * Sets the apk filter to be represented in this dialog. */ public void setApkFilter(List filter) { apkFilterTextField.setText(filter != null ? ListUtil.commaSeparatedString(filter, true) : DEFAULT_APK_FILTER); } /** * Returns the apk filter currently represented in this dialog. */ public List getApkFilter() { String filter = apkFilterTextField.getText(); return filter.equals(DEFAULT_APK_FILTER) ? null : ListUtil.commaSeparatedList(filter); } /** * Sets the jar filter to be represented in this dialog. */ public void setJarFilter(List filter) { jarFilterTextField.setText(filter != null ? ListUtil.commaSeparatedString(filter, true) : DEFAULT_JAR_FILTER); } /** * Returns the jar filter currently represented in this dialog. */ public List getJarFilter() { String filter = jarFilterTextField.getText(); return filter.equals(DEFAULT_JAR_FILTER) ? null : ListUtil.commaSeparatedList(filter); } /** * Sets the aar filter to be represented in this dialog. */ public void setAarFilter(List filter) { aarFilterTextField.setText(filter != null ? ListUtil.commaSeparatedString(filter, true) : DEFAULT_AAR_FILTER); } /** * Returns the aar filter currently represented in this dialog. */ public List getAarFilter() { String filter = aarFilterTextField.getText(); return filter.equals(DEFAULT_AAR_FILTER) ? null : ListUtil.commaSeparatedList(filter); } /** * Sets the war filter to be represented in this dialog. */ public void setWarFilter(List filter) { warFilterTextField.setText(filter != null ? ListUtil.commaSeparatedString(filter, true) : DEFAULT_WAR_FILTER); } /** * Returns the war filter currently represented in this dialog. */ public List getWarFilter() { String filter = warFilterTextField.getText(); return filter.equals(DEFAULT_WAR_FILTER) ? null : ListUtil.commaSeparatedList(filter); } /** * Sets the ear filter to be represented in this dialog. */ public void setEarFilter(List filter) { earFilterTextField.setText(filter != null ? ListUtil.commaSeparatedString(filter, true) : DEFAULT_EAR_FILTER); } /** * Returns the ear filter currently represented in this dialog. */ public List getEarFilter() { String filter = earFilterTextField.getText(); return filter.equals(DEFAULT_EAR_FILTER) ? null : ListUtil.commaSeparatedList(filter); } /** * Sets the zip filter to be represented in this dialog. */ public void setZipFilter(List filter) { zipFilterTextField.setText(filter != null ? ListUtil.commaSeparatedString(filter, true) : DEFAULT_ZIP_FILTER); } /** * Returns the zip filter currently represented in this dialog. */ public List getZipFilter() { String filter = zipFilterTextField.getText(); return filter.equals(DEFAULT_ZIP_FILTER) ? null : ListUtil.commaSeparatedList(filter); } /** * Shows this dialog. This method only returns when the dialog is closed. * * @return CANCEL_OPTION or APPROVE_OPTION, * 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); } }