improved queue

This commit is contained in:
rdavidek 2026-01-20 22:26:22 +01:00
parent 93abc7185c
commit 7143c36ca3
2 changed files with 70 additions and 1 deletions

View File

@ -71,6 +71,13 @@ public class FileOperationQueue {
startNextTask(); startNextTask();
} }
public void cancelAll() {
for (QueuedTask task : tasks) {
task.cancel();
}
notifyListeners();
}
public void addListener(Consumer<List<QueuedTask>> listener) { public void addListener(Consumer<List<QueuedTask>> listener) {
listeners.add(listener); listeners.add(listener);
} }

View File

@ -6,7 +6,11 @@ import cz.kamma.kfmanager.service.FileOperationQueue.QueuedTask;
import javax.swing.*; import javax.swing.*;
import javax.swing.table.AbstractTableModel; import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import java.awt.*; import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -36,6 +40,12 @@ public class OperationQueueDialog extends JDialog {
table.getColumnModel().getColumn(2).setCellRenderer(new ProgressRenderer()); 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); JScrollPane scrollPane = new JScrollPane(table);
add(scrollPane, BorderLayout.CENTER); add(scrollPane, BorderLayout.CENTER);
@ -43,9 +53,13 @@ public class OperationQueueDialog extends JDialog {
JButton closeButton = new JButton("Close"); JButton closeButton = new JButton("Close");
closeButton.addActionListener(e -> setVisible(false)); closeButton.addActionListener(e -> setVisible(false));
JButton cancelAllButton = new JButton("Cancel All");
cancelAllButton.addActionListener(e -> FileOperationQueue.getInstance().cancelAll());
JButton clearButton = new JButton("Clear Completed"); JButton clearButton = new JButton("Clear Completed");
clearButton.addActionListener(e -> FileOperationQueue.getInstance().clearCompleted()); clearButton.addActionListener(e -> FileOperationQueue.getInstance().clearCompleted());
buttonPanel.add(cancelAllButton);
buttonPanel.add(clearButton); buttonPanel.add(clearButton);
buttonPanel.add(closeButton); buttonPanel.add(closeButton);
add(buttonPanel, BorderLayout.SOUTH); add(buttonPanel, BorderLayout.SOUTH);
@ -60,7 +74,7 @@ public class OperationQueueDialog extends JDialog {
private class TaskTableModel extends AbstractTableModel { private class TaskTableModel extends AbstractTableModel {
private List<QueuedTask> tasks = new ArrayList<>(); private List<QueuedTask> 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<QueuedTask> tasks) { public void setTasks(List<QueuedTask> tasks) {
this.tasks = tasks; this.tasks = tasks;
@ -74,6 +88,11 @@ public class OperationQueueDialog extends JDialog {
@Override @Override
public String getColumnName(int column) { return columns[column]; } public String getColumnName(int column) { return columns[column]; }
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return columnIndex == 4;
}
@Override @Override
public Object getValueAt(int rowIndex, int columnIndex) { public Object getValueAt(int rowIndex, int columnIndex) {
QueuedTask task = tasks.get(rowIndex); QueuedTask task = tasks.get(rowIndex);
@ -82,11 +101,54 @@ public class OperationQueueDialog extends JDialog {
case 1: return task.getStatus().toString(); case 1: return task.getStatus().toString();
case 2: return task; // For progress renderer case 2: return task; // For progress renderer
case 3: return task.getCurrentFile(); case 3: return task.getCurrentFile();
case 4: return "X";
default: return null; 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 class ProgressRenderer extends DefaultTableCellRenderer {
private final JProgressBar progressBar = new JProgressBar(0, 100); private final JProgressBar progressBar = new JProgressBar(0, 100);