]> gitweb.fperrin.net Git - GpsPrune.git/blob - tim/prune/function/deletebydate/DeleteByDateFunction.java
Version 19, May 2018
[GpsPrune.git] / tim / prune / function / deletebydate / DeleteByDateFunction.java
1 package tim.prune.function.deletebydate;
2
3 import java.awt.BorderLayout;
4 import java.awt.Component;
5 import java.awt.Dimension;
6 import java.awt.FlowLayout;
7 import java.awt.event.ActionEvent;
8 import java.awt.event.ActionListener;
9 import java.awt.event.KeyAdapter;
10 import java.awt.event.KeyEvent;
11 import java.util.Date;
12
13 import javax.swing.BorderFactory;
14 import javax.swing.JButton;
15 import javax.swing.JDialog;
16 import javax.swing.JLabel;
17 import javax.swing.JPanel;
18 import javax.swing.JScrollPane;
19 import javax.swing.JTable;
20
21 import tim.prune.App;
22 import tim.prune.DataSubscriber;
23 import tim.prune.I18nManager;
24 import tim.prune.UpdateMessageBroker;
25 import tim.prune.config.TimezoneHelper;
26 import tim.prune.data.DataPoint;
27 import tim.prune.function.compress.MarkAndDeleteFunction;
28
29 /**
30  * Function to select a date or dates,
31  * and mark the corresponding points for deletion
32  */
33 public class DeleteByDateFunction extends MarkAndDeleteFunction
34 {
35         /** dialog for selecting dates */
36         private JDialog _dialog = null;
37         /** Ok button */
38         private JButton _okButton = null;
39         /** date info list */
40         private DateInfoList _infoList = new DateInfoList();
41
42
43         /**
44          * Constructor
45          * @param inApp App object
46          */
47         public DeleteByDateFunction(App inApp)
48         {
49                 super(inApp);
50         }
51
52         @Override
53         public String getNameKey() {
54                 return "function.deletebydate";
55         }
56
57         @Override
58         public void begin()
59         {
60                 // Select the current timezone
61                 DateInfo.setTimezone(TimezoneHelper.getSelectedTimezone());
62
63                 // Make a list of which dates are present in the track
64                 _infoList.clearAll();
65                 final int numPoints = _app.getTrackInfo().getTrack().getNumPoints();
66                 for (int i=0; i<numPoints; i++)
67                 {
68                         DataPoint point = _app.getTrackInfo().getTrack().getPoint(i);
69                         if (point != null)
70                         {
71                                 if (point.hasTimestamp()) {
72                                         _infoList.addPoint(point.getTimestamp()
73                                                 .getCalendar(TimezoneHelper.getSelectedTimezone()).getTime());
74                                 }
75                                 else {
76                                         _infoList.addPoint(null); // no timestamp available
77                                 }
78                         }
79                 }
80
81                 // Complain if there is only one entry in the list - this means all points are on the same day
82                 if (_infoList.getNumEntries() < 2)
83                 {
84                         _app.showErrorMessage(getNameKey(), "dialog.deletebydate.onlyonedate");
85                 }
86                 else
87                 {
88                         // Create and build dialog if necessary
89                         if (_dialog == null)
90                         {
91                                 _dialog = new JDialog(_parentFrame, I18nManager.getText(getNameKey()), true);
92                                 _dialog.setLocationRelativeTo(_parentFrame);
93                                 _dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
94                                 _dialog.getContentPane().add(makeDialogComponents());
95                                 _dialog.pack();
96                         }
97                         // Show dialog
98                         _dialog.setVisible(true);
99                 }
100         }
101
102         /**
103          * Create dialog components
104          * @return Panel containing all gui elements in dialog
105          */
106         private Component makeDialogComponents()
107         {
108                 JPanel dialogPanel = new JPanel();
109                 dialogPanel.setLayout(new BorderLayout(5, 5));
110                 // Label at top
111                 JLabel topLabel = new JLabel(I18nManager.getText("dialog.deletebydate.intro"));
112                 topLabel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
113                 dialogPanel.add(topLabel, BorderLayout.NORTH);
114
115                 // close window if escape pressed
116                 KeyAdapter escListener = new KeyAdapter() {
117                         public void keyReleased(KeyEvent inE) {
118                                 if (inE.getKeyCode() == KeyEvent.VK_ESCAPE) {
119                                         _dialog.dispose();
120                                 }
121                         }
122                 };
123
124                 JTable infoTable = new JTable(new DeletionTableModel(_infoList));
125                 JScrollPane pane = new JScrollPane(infoTable);
126                 pane.setPreferredSize(new Dimension(300, 80));
127                 pane.setBorder(BorderFactory.createEmptyBorder(2, 50, 2, 50));
128                 dialogPanel.add(pane, BorderLayout.CENTER);
129
130                 // button panel at bottom
131                 JPanel buttonPanel = new JPanel();
132                 buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
133                 // OK button
134                 _okButton = new JButton(I18nManager.getText("button.ok"));
135                 _okButton.addActionListener(new ActionListener() {
136                         public void actionPerformed(ActionEvent e) {
137                                 performDelete();
138                         }
139                 });
140                 buttonPanel.add(_okButton);
141                 _okButton.addKeyListener(escListener);
142                 // Cancel button
143                 JButton cancelButton = new JButton(I18nManager.getText("button.cancel"));
144                 cancelButton.addActionListener(new ActionListener() {
145                         public void actionPerformed(ActionEvent e) {
146                                 _dialog.dispose();
147                         }
148                 });
149                 cancelButton.addKeyListener(new KeyAdapter() {
150                         public void keyPressed(KeyEvent inE) {
151                                 if (inE.getKeyCode() == KeyEvent.VK_ESCAPE) {_dialog.dispose();}
152                         }
153                 });
154                 buttonPanel.add(cancelButton);
155                 dialogPanel.add(buttonPanel, BorderLayout.SOUTH);
156                 return dialogPanel;
157         }
158
159         /**
160          * Do the actual point deletion according to the
161          * selected rows in the table
162          */
163         private void performDelete()
164         {
165                 int numMarked = 0;
166                 final int numPoints = _app.getTrackInfo().getTrack().getNumPoints();
167                 final int numDates = _infoList.getNumEntries();
168                 // Loop over all points to mark each one for deletion or not
169                 for (int p=0; p<numPoints; p++)
170                 {
171                         DataPoint point = _app.getTrackInfo().getTrack().getPoint(p);
172                         if (point != null)
173                         {
174                                 final Date date = (point.hasTimestamp() ?
175                                         point.getTimestamp().getCalendar(TimezoneHelper.getSelectedTimezone()).getTime()
176                                         : null);
177                                 boolean pointMarked = false;
178                                 // Try to match each of the date info objects in the list
179                                 for (int d=0; d<numDates; d++)
180                                 {
181                                         DateInfo info = _infoList.getDateInfo(d);
182                                         if ( (info.isDateless() && date == null) // matches dateless
183                                           || (!info.isDateless() && date != null && info.isSameDate(date)))
184                                         {
185                                                 pointMarked = info.getDeleteFlag();
186                                                 break;
187                                         }
188                                 }
189                                 point.setMarkedForDeletion(pointMarked);
190                                 if (pointMarked) {
191                                         numMarked++;
192                                 }
193                         }
194                 }
195                 // Now points have been marked, we can ask user to delete them (or delete automatically)
196                 if (numMarked > 0) {
197                         optionallyDeleteMarkedPoints(numMarked);
198                 }
199                 else
200                 {
201                         // Do nothing   //System.out.println("Nothing selected to delete!");
202                         // delete flags might have been reset, so refresh display
203                         UpdateMessageBroker.informSubscribers(DataSubscriber.SELECTION_CHANGED);
204                 }
205                 _dialog.dispose();
206         }
207 }