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();
}
}