Files
LinBAT/ui/src/FileSelectionPanel.java
T
2026-11-03 21:10:04 -03:00

160 lines
4.2 KiB
Java

import javax.swing.*;
import java.awt.*;
import java.io.File;
import java.util.List;
public final class FileSelectionPanel extends JPanel {
private final DefaultListModel<File> fileModel;
private final JList<File> fileList;
public FileSelectionPanel() {
super(new BorderLayout(8, 8));
fileModel = new DefaultListModel<>();
fileList = new JList<>(fileModel);
fileList.setCellRenderer((list, file, index, selected, focus) -> {
String name = file.getName();
if (name.isEmpty()) {
name = file.getAbsolutePath();
}
JLabel label = new JLabel(
name + " — " + getFileSize(file)
);
label.setOpaque(true);
label.setBorder(
BorderFactory.createEmptyBorder(6, 8, 6, 8)
);
if (selected) {
label.setBackground(list.getSelectionBackground());
label.setForeground(list.getSelectionForeground());
} else {
label.setBackground(list.getBackground());
label.setForeground(list.getForeground());
}
return label;
});
JButton addFilesButton = new JButton("Añadir archivos");
JButton addFolderButton = new JButton("Añadir carpeta");
JButton removeButton = new JButton("Quitar selección");
addFilesButton.addActionListener(event -> selectFiles());
addFolderButton.addActionListener(event -> selectFolder());
removeButton.addActionListener(event -> removeSelectedFiles());
JPanel buttons = new JPanel(
new FlowLayout(FlowLayout.LEFT)
);
buttons.add(addFilesButton);
buttons.add(addFolderButton);
buttons.add(removeButton);
add(buttons, BorderLayout.NORTH);
add(new JScrollPane(fileList), BorderLayout.CENTER);
}
private void selectFiles() {
JFileChooser chooser = new JFileChooser();
chooser.setMultiSelectionEnabled(true);
chooser.setFileSelectionMode(
JFileChooser.FILES_ONLY
);
int result = chooser.showOpenDialog(this);
if (result == JFileChooser.APPROVE_OPTION) {
for (File file : chooser.getSelectedFiles()) {
addFile(file);
}
}
}
private void selectFolder() {
JFileChooser chooser = new JFileChooser();
chooser.setFileSelectionMode(
JFileChooser.DIRECTORIES_ONLY
);
int result = chooser.showOpenDialog(this);
if (result == JFileChooser.APPROVE_OPTION) {
addFile(chooser.getSelectedFile());
}
}
private void addFile(File file) {
if (!file.exists()) {
return;
}
for (int i = 0; i < fileModel.size(); i++) {
if (fileModel.get(i).equals(file)) {
return;
}
}
if (file.getName().toLowerCase().endsWith(".lbt")) {
JOptionPane.showMessageDialog(
this,
"No se pueden añadir archivos .lbt para comprimir.",
"Archivo no permitido",
JOptionPane.WARNING_MESSAGE
);
return;
}
fileModel.addElement(file);
}
private void removeSelectedFiles() {
List<File> selectedFiles = fileList.getSelectedValuesList();
for (File file : selectedFiles) {
fileModel.removeElement(file);
}
}
private String getFileSize(File file) {
if (file.isDirectory()) {
return "Carpeta";
}
long bytes = file.length();
if (bytes < 1024) {
return bytes + " B";
}
if (bytes < 1024 * 1024) {
return String.format("%.1f KB", bytes / 1024.0);
}
if (bytes < 1024L * 1024 * 1024) {
return String.format(
"%.1f MB",
bytes / (1024.0 * 1024.0)
);
}
return String.format(
"%.2f GB",
bytes / (1024.0 * 1024.0 * 1024.0)
);
}
public List<File> getSelectedFiles() {
return fileList.getSelectedValuesList();
}
}