1b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/*
2b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ProGuard -- shrinking, optimization, obfuscation, and preverification
3b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *             of Java bytecode.
4b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
5b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
6b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
7b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This program is free software; you can redistribute it and/or modify it
8b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * under the terms of the GNU General Public License as published by the Free
9b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Software Foundation; either version 2 of the License, or (at your option)
10b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * any later version.
11b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
12b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This program is distributed in the hope that it will be useful, but WITHOUT
13b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * more details.
16b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
17b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * You should have received a copy of the GNU General Public License along
18b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * with this program; if not, write to the Free Software Foundation, Inc.,
19b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */
21b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopackage proguard.gui;
22b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
23b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.optimize.Optimizer;
24b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.util.*;
25b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
26b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport javax.swing.*;
27b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport javax.swing.border.*;
28b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport java.awt.*;
29b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport java.awt.event.*;
30b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
31b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/**
32b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This <code>JDialog</code> allows the user to enter a String.
33b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
34b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @author Eric Lafortune
35b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */
36b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratofinal class OptimizationsDialog extends JDialog
37b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{
38b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
39b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Return value if the dialog is canceled (with the Cancel button or by
40b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * closing the dialog window).
41b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
42b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static final int CANCEL_OPTION = 1;
43b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
44b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
45b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Return value if the dialog is approved (with the Ok button).
46b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
47b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public static final int APPROVE_OPTION = 0;
48b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
49b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
50b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private final JCheckBox[] optimizationCheckBoxes = new JCheckBox[Optimizer.OPTIMIZATION_NAMES.length];
51b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
52b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private int returnValue;
53b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
54b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
55b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public OptimizationsDialog(JFrame owner)
56b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
57b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        super(owner, msg("selectOptimizations"), true);
58b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        setResizable(true);
59b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
60b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Create some constraints that can be reused.
61b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        GridBagConstraints constraintsLast = new GridBagConstraints();
62b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        constraintsLast.gridwidth = GridBagConstraints.REMAINDER;
63b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        constraintsLast.anchor    = GridBagConstraints.WEST;
64b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        constraintsLast.insets    = new Insets(1, 2, 1, 2);
65b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        GridBagConstraints constraintsLastStretch = new GridBagConstraints();
67b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        constraintsLastStretch.gridwidth = GridBagConstraints.REMAINDER;
68b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        constraintsLastStretch.fill      = GridBagConstraints.HORIZONTAL;
69b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        constraintsLastStretch.weightx   = 1.0;
70b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        constraintsLastStretch.anchor    = GridBagConstraints.WEST;
71b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        constraintsLastStretch.insets    = constraintsLast.insets;
72b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
73b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        GridBagConstraints panelConstraints = new GridBagConstraints();
74b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        panelConstraints.gridwidth = GridBagConstraints.REMAINDER;
75b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        panelConstraints.fill      = GridBagConstraints.HORIZONTAL;
76b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        panelConstraints.weightx   = 1.0;
77b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        panelConstraints.weighty   = 0.0;
78b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        panelConstraints.anchor    = GridBagConstraints.NORTHWEST;
79b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        panelConstraints.insets    = constraintsLast.insets;
80b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
81b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        GridBagConstraints selectButtonConstraints = new GridBagConstraints();
82b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        selectButtonConstraints.weighty = 1.0;
83b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        selectButtonConstraints.anchor  = GridBagConstraints.SOUTHWEST;
84b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        selectButtonConstraints.insets  = new Insets(4, 4, 8, 4);
85b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
86b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        GridBagConstraints okButtonConstraints = new GridBagConstraints();
87b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        okButtonConstraints.weightx = 1.0;
88b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        okButtonConstraints.weighty = 1.0;
89b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        okButtonConstraints.anchor  = GridBagConstraints.SOUTHEAST;
90b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        okButtonConstraints.insets  = selectButtonConstraints.insets;
91b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
92b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        GridBagConstraints cancelButtonConstraints = new GridBagConstraints();
93b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        cancelButtonConstraints.gridwidth = GridBagConstraints.REMAINDER;
94b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        cancelButtonConstraints.weighty   = 1.0;
95b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        cancelButtonConstraints.anchor    = GridBagConstraints.SOUTHEAST;
96b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        cancelButtonConstraints.insets    = selectButtonConstraints.insets;
97b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
98b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        GridBagLayout layout = new GridBagLayout();
99b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
100b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        Border etchedBorder = BorderFactory.createEtchedBorder(EtchedBorder.RAISED);
101b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
102b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Create the optimizations panel.
103b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        JPanel optimizationsPanel     = new JPanel(layout);
104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        JPanel optimizationSubpanel   = null;
105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        String lastOptimizationPrefix = null;
106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
107b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        for (int index = 0; index < Optimizer.OPTIMIZATION_NAMES.length; index++)
108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            String optimizationName = Optimizer.OPTIMIZATION_NAMES[index];
110b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            String optimizationPrefix = optimizationName.substring(0, optimizationName.indexOf('/'));
112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (optimizationSubpanel == null || !optimizationPrefix.equals(lastOptimizationPrefix))
114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // Create a new keep subpanel and add it.
116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                optimizationSubpanel = new JPanel(layout);
117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                optimizationSubpanel.setBorder(BorderFactory.createTitledBorder(etchedBorder, msg(optimizationPrefix)));
118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                optimizationsPanel.add(optimizationSubpanel, panelConstraints);
119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                lastOptimizationPrefix = optimizationPrefix;
121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            JCheckBox optimizationCheckBox = new JCheckBox(optimizationName);
124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            optimizationCheckBoxes[index] = optimizationCheckBox;
125b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
126b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            optimizationSubpanel.add(tip(optimizationCheckBox, optimizationName.replace('/', '_')+"Tip"), constraintsLastStretch);
127b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Create the Select All button.
130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        JButton selectAllButton = new JButton(msg("selectAll"));
131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        selectAllButton.addActionListener(new ActionListener()
132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            public void actionPerformed(ActionEvent e)
134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                for (int index = 0; index < optimizationCheckBoxes.length; index++)
136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
137b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    optimizationCheckBoxes[index].setSelected(true);
138b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
139b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
140b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        });
141b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Create the Select All button.
143b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        JButton selectNoneButton = new JButton(msg("selectNone"));
144b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        selectNoneButton.addActionListener(new ActionListener()
145b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
146b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            public void actionPerformed(ActionEvent e)
147b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
148b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                for (int index = 0; index < optimizationCheckBoxes.length; index++)
149b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
150b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    optimizationCheckBoxes[index].setSelected(false);
151b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
152b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
153b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        });
154b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
155b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Create the Ok button.
156b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        JButton okButton = new JButton(msg("ok"));
157b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        okButton.addActionListener(new ActionListener()
158b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
159b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            public void actionPerformed(ActionEvent e)
160b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
161b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                returnValue = APPROVE_OPTION;
162b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                hide();
163b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
164b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        });
165b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
166b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Create the Cancel button.
167b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        JButton cancelButton = new JButton(msg("cancel"));
168b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        cancelButton.addActionListener(new ActionListener()
169b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
170b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            public void actionPerformed(ActionEvent e)
171b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
172b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                hide();
173b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
174b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        });
175b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
176b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Add all panels to the main panel.
177b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        optimizationsPanel.add(selectAllButton,  selectButtonConstraints);
178b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        optimizationsPanel.add(selectNoneButton, selectButtonConstraints);
179b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        optimizationsPanel.add(okButton,         okButtonConstraints);
180b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        optimizationsPanel.add(cancelButton,     cancelButtonConstraints);
181b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
182b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        getContentPane().add(new JScrollPane(optimizationsPanel));
183b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
184b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
185b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
186b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
187b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Sets the initial optimization filter to be used by the dialog.
188b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
189b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void setFilter(String optimizations)
190b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
191b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        StringMatcher filter = optimizations != null && optimizations.length() > 0 ?
192b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            new ListParser(new NameParser()).parse(optimizations) :
193b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            new FixedStringMatcher("");
194b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
195b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        for (int index = 0; index < Optimizer.OPTIMIZATION_NAMES.length; index++)
196b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
197b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            optimizationCheckBoxes[index].setSelected(filter.matches(Optimizer.OPTIMIZATION_NAMES[index]));
198b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
199b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
200b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
201b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
202b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
203b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the optimization filter composed from the settings in the dialog.
204b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
205b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public String getFilter()
206b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
207b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return new FilterBuilder(optimizationCheckBoxes, '/').buildFilter();
208b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
209b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
210b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
211b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
212b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Shows this dialog. This method only returns when the dialog is closed.
213b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *
214b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return <code>CANCEL_OPTION</code> or <code>APPROVE_OPTION</code>,
215b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     *         depending on the choice of the user.
216b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
217b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public int showDialog()
218b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
219b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        returnValue = CANCEL_OPTION;
220b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
221b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Open the dialog in the right place, then wait for it to be closed,
222b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // one way or another.
223b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        pack();
224b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        setLocationRelativeTo(getOwner());
225b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        show();
226b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
227b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return returnValue;
228b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
229b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
230b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
231b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
232b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Attaches the tool tip from the GUI resources that corresponds to the
233b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * given key, to the given component.
234b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
235b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private static JComponent tip(JComponent component, String messageKey)
236b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
237b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        component.setToolTipText(msg(messageKey));
238b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
239b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return component;
240b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
241b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
242b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
243b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
244b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the message from the GUI resources that corresponds to the given
245b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * key.
246b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
247b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private static String msg(String messageKey)
248b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
249b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato         return GUIResources.getMessage(messageKey);
250b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
251b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}