--- /dev/null
+package tim.prune.function.deletebydate;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyAdapter;
+import java.awt.event.KeyEvent;
+import java.util.Date;
+
+import javax.swing.BorderFactory;
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+
+import tim.prune.App;
+import tim.prune.DataSubscriber;
+import tim.prune.I18nManager;
+import tim.prune.UpdateMessageBroker;
+import tim.prune.config.TimezoneHelper;
+import tim.prune.data.DataPoint;
+import tim.prune.function.compress.MarkAndDeleteFunction;
+
+/**
+ * Function to select a date or dates,
+ * and mark the corresponding points for deletion
+ */
+public class DeleteByDateFunction extends MarkAndDeleteFunction
+{
+ /** dialog for selecting dates */
+ private JDialog _dialog = null;
+ /** Ok button */
+ private JButton _okButton = null;
+ /** date info list */
+ private DateInfoList _infoList = new DateInfoList();
+
+
+ /**
+ * Constructor
+ * @param inApp App object
+ */
+ public DeleteByDateFunction(App inApp)
+ {
+ super(inApp);
+ }
+
+ @Override
+ public String getNameKey() {
+ return "function.deletebydate";
+ }
+
+ @Override
+ public void begin()
+ {
+ // Select the current timezone
+ DateInfo.setTimezone(TimezoneHelper.getSelectedTimezone());
+
+ // Make a list of which dates are present in the track
+ _infoList.clearAll();
+ final int numPoints = _app.getTrackInfo().getTrack().getNumPoints();
+ for (int i=0; i<numPoints; i++)
+ {
+ DataPoint point = _app.getTrackInfo().getTrack().getPoint(i);
+ if (point != null)
+ {
+ if (point.hasTimestamp()) {
+ _infoList.addPoint(point.getTimestamp()
+ .getCalendar(TimezoneHelper.getSelectedTimezone()).getTime());
+ }
+ else {
+ _infoList.addPoint(null); // no timestamp available
+ }
+ }
+ }
+
+ // Complain if there is only one entry in the list - this means all points are on the same day
+ if (_infoList.getNumEntries() < 2)
+ {
+ _app.showErrorMessage(getNameKey(), "dialog.deletebydate.onlyonedate");
+ }
+ else
+ {
+ // Create and build dialog if necessary
+ if (_dialog == null)
+ {
+ _dialog = new JDialog(_parentFrame, I18nManager.getText(getNameKey()), true);
+ _dialog.setLocationRelativeTo(_parentFrame);
+ _dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
+ _dialog.getContentPane().add(makeDialogComponents());
+ _dialog.pack();
+ }
+ // Show dialog
+ _dialog.setVisible(true);
+ }
+ }
+
+ /**
+ * Create dialog components
+ * @return Panel containing all gui elements in dialog
+ */
+ private Component makeDialogComponents()
+ {
+ JPanel dialogPanel = new JPanel();
+ dialogPanel.setLayout(new BorderLayout(5, 5));
+ // Label at top
+ JLabel topLabel = new JLabel(I18nManager.getText("dialog.deletebydate.intro"));
+ topLabel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
+ dialogPanel.add(topLabel, BorderLayout.NORTH);
+
+ // close window if escape pressed
+ KeyAdapter escListener = new KeyAdapter() {
+ public void keyReleased(KeyEvent inE) {
+ if (inE.getKeyCode() == KeyEvent.VK_ESCAPE) {
+ _dialog.dispose();
+ }
+ }
+ };
+
+ JTable infoTable = new JTable(new DeletionTableModel(_infoList));
+ JScrollPane pane = new JScrollPane(infoTable);
+ pane.setPreferredSize(new Dimension(300, 80));
+ pane.setBorder(BorderFactory.createEmptyBorder(2, 50, 2, 50));
+ dialogPanel.add(pane, BorderLayout.CENTER);
+
+ // button panel at bottom
+ JPanel buttonPanel = new JPanel();
+ buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
+ // OK button
+ _okButton = new JButton(I18nManager.getText("button.ok"));
+ _okButton.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ performDelete();
+ }
+ });
+ buttonPanel.add(_okButton);
+ _okButton.addKeyListener(escListener);
+ // Cancel button
+ JButton cancelButton = new JButton(I18nManager.getText("button.cancel"));
+ cancelButton.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ _dialog.dispose();
+ }
+ });
+ cancelButton.addKeyListener(new KeyAdapter() {
+ public void keyPressed(KeyEvent inE) {
+ if (inE.getKeyCode() == KeyEvent.VK_ESCAPE) {_dialog.dispose();}
+ }
+ });
+ buttonPanel.add(cancelButton);
+ dialogPanel.add(buttonPanel, BorderLayout.SOUTH);
+ return dialogPanel;
+ }
+
+ /**
+ * Do the actual point deletion according to the
+ * selected rows in the table
+ */
+ private void performDelete()
+ {
+ int numMarked = 0;
+ final int numPoints = _app.getTrackInfo().getTrack().getNumPoints();
+ final int numDates = _infoList.getNumEntries();
+ // Loop over all points to mark each one for deletion or not
+ for (int p=0; p<numPoints; p++)
+ {
+ DataPoint point = _app.getTrackInfo().getTrack().getPoint(p);
+ if (point != null)
+ {
+ final Date date = (point.hasTimestamp() ?
+ point.getTimestamp().getCalendar(TimezoneHelper.getSelectedTimezone()).getTime()
+ : null);
+ boolean pointMarked = false;
+ // Try to match each of the date info objects in the list
+ for (int d=0; d<numDates; d++)
+ {
+ DateInfo info = _infoList.getDateInfo(d);
+ if ( (info.isDateless() && date == null) // matches dateless
+ || (!info.isDateless() && date != null && info.isSameDate(date)))
+ {
+ pointMarked = info.getDeleteFlag();
+ break;
+ }
+ }
+ point.setMarkedForDeletion(pointMarked);
+ if (pointMarked) {
+ numMarked++;
+ }
+ }
+ }
+ // Now points have been marked, we can ask user to delete them (or delete automatically)
+ if (numMarked > 0) {
+ optionallyDeleteMarkedPoints(numMarked);
+ }
+ else
+ {
+ // Do nothing //System.out.println("Nothing selected to delete!");
+ // delete flags might have been reset, so refresh display
+ UpdateMessageBroker.informSubscribers(DataSubscriber.SELECTION_CHANGED);
+ }
+ _dialog.dispose();
+ }
+}