package tim.prune.load.babel; import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JPanel; import tim.prune.I18nManager; import tim.prune.gui.WizardLayout; /** * Class to manage a dialog for adding a single GPSBabel filter */ public class AddFilterDialog { /** Parent panel to pass the filter back to */ private BabelFilterPanel _parentPanel = null; /** Reference to parent frame */ private JFrame _parentFrame = null; /** Main dialog */ private JDialog _dialog = null; /** layout for dealing with cards */ private WizardLayout _wizard = null; /** Array of filter definitions */ private FilterDefinition[] _filters = new FilterDefinition[4]; /** Finish button */ private JButton _finishButton = null; /** back button */ private JButton _backButton = null; // Selector class for one of the filter types class FilterTypeListener implements ActionListener { private int _index = 0; public FilterTypeListener(int inIndex) {_index = inIndex;} public void actionPerformed(ActionEvent e) { _wizard.showCard(_index); _backButton.setEnabled(true); filterParamsChanged(); // to check parameters and enable/disable Finish button } } /** * Constructor * @param inParent parent panel to inform of selected filter * @param inParentFrame parent frame to reference for dialogs */ public AddFilterDialog(BabelFilterPanel inParent, JFrame inParentFrame) { _parentPanel = inParent; _parentFrame = inParentFrame; } /** * Show the dialog to add a new filter */ public void showDialog() { if (_dialog == null) { _dialog = new JDialog(_parentFrame, I18nManager.getText("dialog.addfilter.title"), true); _dialog.setLocationRelativeTo(_parentFrame); _dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); _dialog.getContentPane().add(makeDialogComponents()); _dialog.pack(); } // TODO: Initialise cards, clear entries? _wizard.showFirstCard(); _backButton.setEnabled(false); _finishButton.setEnabled(false); _dialog.setVisible(true); } /** * Create dialog components * @return Panel containing all gui elements in dialog */ private JPanel makeDialogComponents() { JPanel dialogPanel = new JPanel(); dialogPanel.setLayout(new BorderLayout()); // card panel in the middle JPanel cardPanel = new JPanel(); _wizard = new WizardLayout(cardPanel); JPanel typesCard = new JPanel(); JButton discardButton = new JButton(I18nManager.getText("dialog.gpsbabel.filter.discard")); discardButton.addActionListener(new FilterTypeListener(1)); typesCard.add(discardButton); JButton simplifyButton = new JButton(I18nManager.getText("dialog.gpsbabel.filter.simplify")); simplifyButton.addActionListener(new FilterTypeListener(2)); typesCard.add(simplifyButton); JButton distanceButton = new JButton(I18nManager.getText("dialog.gpsbabel.filter.distance")); distanceButton.addActionListener(new FilterTypeListener(3)); typesCard.add(distanceButton); JButton interpButton = new JButton(I18nManager.getText("dialog.gpsbabel.filter.interpolate")); interpButton.addActionListener(new FilterTypeListener(4)); typesCard.add(interpButton); // discard panel _filters[0] = new DiscardFilter(this); // simplify panel _filters[1] = new SimplifyFilter(this); // distance panel _filters[2] = new DistanceFilter(this); // interpolate panel _filters[3] = new InterpolateFilter(this); // Add cards to the wizard _wizard.addCard(typesCard); _wizard.addCard(_filters[0]); _wizard.addCard(_filters[1]); _wizard.addCard(_filters[2]); _wizard.addCard(_filters[3]); dialogPanel.add(cardPanel, BorderLayout.CENTER); // button panel at bottom JPanel buttonPanel = new JPanel(); buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER)); _backButton = new JButton(I18nManager.getText("button.back")); _backButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { _wizard.showCard(0); _backButton.setEnabled(!_wizard.isFirstCard()); _finishButton.setEnabled(false); } }); _backButton.setEnabled(false); buttonPanel.add(_backButton); _finishButton = new JButton(I18nManager.getText("button.finish")); ActionListener okListener = new ActionListener() { public void actionPerformed(ActionEvent e) { finish(); } }; _finishButton.addActionListener(okListener); _finishButton.setEnabled(false); buttonPanel.add(_finishButton); JButton cancelButton = new JButton(I18nManager.getText("button.cancel")); cancelButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { _dialog.dispose(); } }); buttonPanel.add(cancelButton); dialogPanel.add(buttonPanel, BorderLayout.SOUTH); dialogPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 15)); return dialogPanel; } /** * React to changes in the filter parameters (such as enabling/disabling the ok button) */ public void filterParamsChanged() { final int currCard = _wizard.getCurrentCardIndex(); if (currCard > 0 && currCard < 5) { _finishButton.setEnabled(_filters[currCard-1].isFilterValid()); } } /** * Finish the dialog when OK pressed */ private void finish() { // finish dialog and pass results back to the parent panel final int currCard = _wizard.getCurrentCardIndex(); if (currCard > 0 && currCard < 5) { _parentPanel.addFilter(_filters[currCard-1].getString()); } _dialog.dispose(); } }