--- /dev/null
+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();
+ }
+}