]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - src/tim/prune/load/babel/AddFilterDialog.java
Moved source into separate src directory due to popular request
[GpsPrune.git] / src / tim / prune / load / babel / AddFilterDialog.java
diff --git a/src/tim/prune/load/babel/AddFilterDialog.java b/src/tim/prune/load/babel/AddFilterDialog.java
new file mode 100644 (file)
index 0000000..7de9a3a
--- /dev/null
@@ -0,0 +1,185 @@
+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();
+       }
+}