| /* |
| * ProGuard -- shrinking, optimization, obfuscation, and preverification |
| * of Java bytecode. |
| * |
| * Copyright (c) 2002-2017 Eric Lafortune @ GuardSquare |
| * |
| * 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 <code>JDialog</code> 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 <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); |
| } |
| } |