]> gitweb.fperrin.net Git - GpsPrune.git/commitdiff
Extend Delete by date function with extra buttons
authoractivityworkshop <mail@activityworkshop.net>
Fri, 2 Apr 2021 17:53:45 +0000 (19:53 +0200)
committeractivityworkshop <mail@activityworkshop.net>
Fri, 2 Apr 2021 17:53:45 +0000 (19:53 +0200)
src/tim/prune/function/deletebydate/DeleteByDateFunction.java
src/tim/prune/lang/prune-texts_en.properties

index 42d52f53b7dda3d75a0c37a7affcf5c47632f0e8..6792c4f7cd28ce9f254d41adc952dc542deb6c1c 100644 (file)
@@ -8,6 +8,8 @@ import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.KeyAdapter;
 import java.awt.event.KeyEvent;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
 import java.util.Date;
 
 import javax.swing.BorderFactory;
@@ -17,6 +19,10 @@ import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
 import javax.swing.JTable;
+import javax.swing.border.EtchedBorder;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+import javax.swing.table.AbstractTableModel;
 
 import tim.prune.App;
 import tim.prune.DataSubscriber;
@@ -34,8 +40,14 @@ public class DeleteByDateFunction extends MarkAndDeleteFunction
 {
        /** dialog for selecting dates */
        private JDialog _dialog = null;
+       /** table */
+       private JTable _infoTable = null;
        /** Ok button */
        private JButton _okButton = null;
+       // panel for selection buttons
+       private JPanel _selButtonPanel = null;
+       private JButton _keepSelectedButton = null;
+       private JButton _delSelectedButton = null;
        /** date info list */
        private DateInfoList _infoList = new DateInfoList();
 
@@ -94,6 +106,8 @@ public class DeleteByDateFunction extends MarkAndDeleteFunction
                                _dialog.getContentPane().add(makeDialogComponents());
                                _dialog.pack();
                        }
+                       _selButtonPanel.setVisible(_infoList.getNumEntries() > 4);
+                       enableButtons();
                        // Show dialog
                        _dialog.setVisible(true);
                }
@@ -121,11 +135,49 @@ public class DeleteByDateFunction extends MarkAndDeleteFunction
                        }
                };
 
-               JTable infoTable = new JTable(new DeletionTableModel(_infoList));
-               JScrollPane pane = new JScrollPane(infoTable);
-               pane.setPreferredSize(new Dimension(300, 80));
+               _infoTable = new JTable(new DeletionTableModel(_infoList));
+               _infoTable.getTableHeader().addMouseListener(new MouseAdapter() {
+                       public void mouseClicked(MouseEvent mouseEvent) {
+                               int index = _infoTable.convertColumnIndexToModel(_infoTable.columnAtPoint(mouseEvent.getPoint()));
+                               if (index >= 2) {
+                                       modifyAllCheckboxes(index == 3); // parameter is true for delete, false for keep
+                               }
+                       }
+               });
+               _infoTable.getSelectionModel().addListSelectionListener(
+                       new ListSelectionListener() {
+                               public void valueChanged(ListSelectionEvent e) {
+                                       enableButtons();
+                               }
+               });
+
+               JScrollPane pane = new JScrollPane(_infoTable);
+               pane.setPreferredSize(new Dimension(300, 180));
                pane.setBorder(BorderFactory.createEmptyBorder(2, 50, 2, 50));
-               dialogPanel.add(pane, BorderLayout.CENTER);
+               JPanel middlePanel = new JPanel();
+               middlePanel.setLayout(new BorderLayout());
+               middlePanel.add(pane, BorderLayout.CENTER);
+               _selButtonPanel = new JPanel();
+               _selButtonPanel.setBorder(BorderFactory.createCompoundBorder(
+                       BorderFactory.createEtchedBorder(EtchedBorder.LOWERED), BorderFactory.createEmptyBorder(4, 4, 4, 4))
+               );
+               _selButtonPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
+               _keepSelectedButton = new JButton(I18nManager.getText("button.keepselected"));
+               _keepSelectedButton.addActionListener(new ActionListener() {
+                       public void actionPerformed(ActionEvent e) {
+                               changeSelectedRowsToKeep();
+                       }
+               });
+               _selButtonPanel.add(_keepSelectedButton);
+               _delSelectedButton = new JButton(I18nManager.getText("button.deleteselected"));
+               _delSelectedButton.addActionListener(new ActionListener() {
+                       public void actionPerformed(ActionEvent e) {
+                               changeSelectedRowsToDelete();
+                       }
+               });
+               _selButtonPanel.add(_delSelectedButton);
+               middlePanel.add(_selButtonPanel, BorderLayout.SOUTH);
+               dialogPanel.add(middlePanel, BorderLayout.CENTER);
 
                // button panel at bottom
                JPanel buttonPanel = new JPanel();
@@ -156,6 +208,66 @@ public class DeleteByDateFunction extends MarkAndDeleteFunction
                return dialogPanel;
        }
 
+       /**
+        * Select a column of checkboxes
+        * @param isDelete true for delete all, false for keep all
+        */
+       private void modifyAllCheckboxes(boolean isDelete)
+       {
+               for (int rowIndex=0; rowIndex<_infoList.getNumEntries(); rowIndex++)
+               {
+                       _infoList.getDateInfo(rowIndex).setDeleteFlag(isDelete);
+               }
+               enableButtons();
+       }
+
+       private void changeSelectedRowsToKeep()
+       {
+               changeSelectedRows(false);
+       }
+       private void changeSelectedRowsToDelete()
+       {
+               changeSelectedRows(true);
+       }
+
+       /**
+        * Change the selected rows to either all keep or all delete
+        * @param isDelete true for delete, false for keep
+        */
+       private void changeSelectedRows(boolean isDelete)
+       {
+               int firstRow = -1, lastRow = -1;
+               for (int rowIndex : _infoTable.getSelectedRows())
+               {
+                       if (firstRow == -1) {firstRow = rowIndex;}
+                       _infoList.getDateInfo(rowIndex).setDeleteFlag(isDelete);
+                       lastRow = rowIndex;
+               }
+               // Make sure all rows between first and last updated ones are updated in the table
+               ((AbstractTableModel) _infoTable.getModel()).fireTableRowsUpdated(firstRow, lastRow);
+               enableButtons();
+       }
+
+       /**
+        * Enable or disable the keepSelected and deleteSelected buttons
+        * according to the current selection
+        */
+       private void enableButtons()
+       {
+               boolean hasKeep = false, hasDelete = false;
+               for (int rowIndex : _infoTable.getSelectedRows())
+               {
+                       if (_infoList.getDateInfo(rowIndex).getDeleteFlag()) {
+                               hasDelete = true;
+                       }
+                       else {
+                               hasKeep = true;
+                       }
+               }
+               _delSelectedButton.setEnabled(hasKeep);
+               _keepSelectedButton.setEnabled(hasDelete);
+       }
+
        /**
         * Do the actual point deletion according to the
         * selected rows in the table
@@ -198,8 +310,8 @@ public class DeleteByDateFunction extends MarkAndDeleteFunction
                }
                else
                {
-                       // Do nothing   //System.out.println("Nothing selected to delete!");
-                       // delete flags might have been reset, so refresh display
+                       // Nothing to be deleted
+                       // Delete flags might have been reset, so refresh display
                        UpdateMessageBroker.informSubscribers(DataSubscriber.SELECTION_CHANGED);
                }
                _dialog.dispose();
index 0b0249817f0fd6cc7d3afef5d5bae92733489eb3..98e26f8780be7340fc0fb27620d9959b693dceb1 100644 (file)
@@ -700,6 +700,8 @@ button.addnew=Add new
 button.delete=Delete
 button.manage=Manage
 button.combine=Combine
+button.keepselected=Keep selected
+button.deleteselected=Delete selected
 
 # File types
 filetype.txt=TXT files