diff --git a/src/main/java/cz/kamma/kfmanager/service/FileOperationQueue.java b/src/main/java/cz/kamma/kfmanager/service/FileOperationQueue.java index c98b700..8cc75c2 100644 --- a/src/main/java/cz/kamma/kfmanager/service/FileOperationQueue.java +++ b/src/main/java/cz/kamma/kfmanager/service/FileOperationQueue.java @@ -71,6 +71,13 @@ public class FileOperationQueue { startNextTask(); } + public void cancelAll() { + for (QueuedTask task : tasks) { + task.cancel(); + } + notifyListeners(); + } + public void addListener(Consumer> listener) { listeners.add(listener); } diff --git a/src/main/java/cz/kamma/kfmanager/ui/OperationQueueDialog.java b/src/main/java/cz/kamma/kfmanager/ui/OperationQueueDialog.java index fb92aa2..a25ba38 100644 --- a/src/main/java/cz/kamma/kfmanager/ui/OperationQueueDialog.java +++ b/src/main/java/cz/kamma/kfmanager/ui/OperationQueueDialog.java @@ -6,7 +6,11 @@ import cz.kamma.kfmanager.service.FileOperationQueue.QueuedTask; import javax.swing.*; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; +import javax.swing.table.TableCellEditor; +import javax.swing.table.TableCellRenderer; import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; @@ -36,6 +40,12 @@ public class OperationQueueDialog extends JDialog { table.getColumnModel().getColumn(2).setCellRenderer(new ProgressRenderer()); + ButtonRendererColumn buttonRenderer = new ButtonRendererColumn(); + table.getColumnModel().getColumn(4).setCellRenderer(buttonRenderer); + table.getColumnModel().getColumn(4).setCellEditor(buttonRenderer); + table.getColumnModel().getColumn(4).setPreferredWidth(40); + table.getColumnModel().getColumn(4).setMaxWidth(50); + JScrollPane scrollPane = new JScrollPane(table); add(scrollPane, BorderLayout.CENTER); @@ -43,9 +53,13 @@ public class OperationQueueDialog extends JDialog { JButton closeButton = new JButton("Close"); closeButton.addActionListener(e -> setVisible(false)); + JButton cancelAllButton = new JButton("Cancel All"); + cancelAllButton.addActionListener(e -> FileOperationQueue.getInstance().cancelAll()); + JButton clearButton = new JButton("Clear Completed"); clearButton.addActionListener(e -> FileOperationQueue.getInstance().clearCompleted()); + buttonPanel.add(cancelAllButton); buttonPanel.add(clearButton); buttonPanel.add(closeButton); add(buttonPanel, BorderLayout.SOUTH); @@ -60,7 +74,7 @@ public class OperationQueueDialog extends JDialog { private class TaskTableModel extends AbstractTableModel { private List tasks = new ArrayList<>(); - private final String[] columns = {"Operation", "Status", "Progress", "Active File"}; + private final String[] columns = {"Operation", "Status", "Progress", "Active File", "Action"}; public void setTasks(List tasks) { this.tasks = tasks; @@ -74,6 +88,11 @@ public class OperationQueueDialog extends JDialog { @Override public String getColumnName(int column) { return columns[column]; } + @Override + public boolean isCellEditable(int rowIndex, int columnIndex) { + return columnIndex == 4; + } + @Override public Object getValueAt(int rowIndex, int columnIndex) { QueuedTask task = tasks.get(rowIndex); @@ -82,11 +101,54 @@ public class OperationQueueDialog extends JDialog { case 1: return task.getStatus().toString(); case 2: return task; // For progress renderer case 3: return task.getCurrentFile(); + case 4: return "X"; default: return null; } } } + private class ButtonRendererColumn extends AbstractCellEditor implements TableCellRenderer, TableCellEditor, ActionListener { + private final JButton button; + private Object currentValue; + + public ButtonRendererColumn() { + button = new JButton(); + button.addActionListener(this); + button.setBorderPainted(false); + button.setFocusPainted(false); + button.setForeground(Color.RED); + button.setFont(button.getFont().deriveFont(Font.BOLD)); + } + + @Override + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { + button.setText(value == null ? "" : value.toString()); + return button; + } + + @Override + public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { + currentValue = value; + button.setText(value == null ? "" : value.toString()); + return button; + } + + @Override + public Object getCellEditorValue() { + return currentValue; + } + + @Override + public void actionPerformed(ActionEvent e) { + int row = table.convertRowIndexToModel(table.getEditingRow()); + if (row != -1) { + QueuedTask task = model.tasks.get(row); + task.cancel(); + stopCellEditing(); + } + } + } + private class ProgressRenderer extends DefaultTableCellRenderer { private final JProgressBar progressBar = new JProgressBar(0, 100);