169 lines
5.5 KiB
Java
169 lines
5.5 KiB
Java
package com.kfmanager.ui;
|
|
|
|
import javax.swing.*;
|
|
import java.awt.*;
|
|
import java.io.File;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
/**
|
|
* Dialog for selecting a drive
|
|
*/
|
|
public class DriveSelector extends JDialog {
|
|
|
|
private File selectedDrive = null;
|
|
|
|
public DriveSelector(Frame parent) {
|
|
super(parent, "Select drive", true);
|
|
initComponents();
|
|
setSize(400, 300);
|
|
setLocationRelativeTo(parent);
|
|
}
|
|
|
|
private void initComponents() {
|
|
setLayout(new BorderLayout(10, 10));
|
|
((JComponent) getContentPane()).setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
|
|
|
|
// Získat seznam dostupných disků
|
|
File[] roots = File.listRoots();
|
|
List<DriveInfo> drives = new ArrayList<>();
|
|
|
|
for (File root : roots) {
|
|
drives.add(new DriveInfo(root));
|
|
}
|
|
|
|
// Seznam disků
|
|
JList<DriveInfo> driveList = new JList<>(drives.toArray(new DriveInfo[0]));
|
|
driveList.setFont(new Font("Monospaced", Font.PLAIN, 14));
|
|
driveList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
|
|
|
|
// Custom renderer to display drive information
|
|
driveList.setCellRenderer(new DefaultListCellRenderer() {
|
|
@Override
|
|
public Component getListCellRendererComponent(JList<?> list, Object value,
|
|
int index, boolean isSelected, boolean cellHasFocus) {
|
|
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
|
|
|
|
if (value instanceof DriveInfo) {
|
|
DriveInfo info = (DriveInfo) value;
|
|
setText(info.getDisplayText());
|
|
}
|
|
|
|
return this;
|
|
}
|
|
});
|
|
|
|
// Double-click pro výběr
|
|
driveList.addMouseListener(new java.awt.event.MouseAdapter() {
|
|
@Override
|
|
public void mouseClicked(java.awt.event.MouseEvent e) {
|
|
if (e.getClickCount() == 2) {
|
|
int index = driveList.locationToIndex(e.getPoint());
|
|
if (index >= 0) {
|
|
selectedDrive = drives.get(index).getRoot();
|
|
dispose();
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
// Enter pro výběr
|
|
driveList.addKeyListener(new java.awt.event.KeyAdapter() {
|
|
@Override
|
|
public void keyPressed(java.awt.event.KeyEvent e) {
|
|
if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) {
|
|
int index = driveList.getSelectedIndex();
|
|
if (index >= 0) {
|
|
selectedDrive = drives.get(index).getRoot();
|
|
dispose();
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
JScrollPane scrollPane = new JScrollPane(driveList);
|
|
add(scrollPane, BorderLayout.CENTER);
|
|
|
|
// Panel s tlačítky
|
|
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
|
|
|
|
JButton okButton = new JButton("OK");
|
|
okButton.addActionListener(e -> {
|
|
int index = driveList.getSelectedIndex();
|
|
if (index >= 0) {
|
|
selectedDrive = drives.get(index).getRoot();
|
|
dispose();
|
|
} else {
|
|
JOptionPane.showMessageDialog(this,
|
|
"Select a drive",
|
|
"Drive selection",
|
|
JOptionPane.INFORMATION_MESSAGE);
|
|
}
|
|
});
|
|
|
|
JButton cancelButton = new JButton("Cancel");
|
|
cancelButton.addActionListener(e -> dispose());
|
|
|
|
buttonPanel.add(okButton);
|
|
buttonPanel.add(cancelButton);
|
|
|
|
add(buttonPanel, BorderLayout.SOUTH);
|
|
|
|
// Automaticky vybrat první disk
|
|
if (drives.size() > 0) {
|
|
driveList.setSelectedIndex(0);
|
|
}
|
|
|
|
driveList.requestFocus();
|
|
}
|
|
|
|
public File getSelectedDrive() {
|
|
return selectedDrive;
|
|
}
|
|
|
|
/**
|
|
* Pomocná třída pro informace o disku
|
|
*/
|
|
private static class DriveInfo {
|
|
private final File root;
|
|
|
|
public DriveInfo(File root) {
|
|
this.root = root;
|
|
}
|
|
|
|
public File getRoot() {
|
|
return root;
|
|
}
|
|
|
|
public String getDisplayText() {
|
|
String path = root.getAbsolutePath();
|
|
long totalSpace = root.getTotalSpace();
|
|
long freeSpace = root.getFreeSpace();
|
|
long usedSpace = totalSpace - freeSpace;
|
|
|
|
if (totalSpace > 0) {
|
|
return String.format("%s %s / %s free",
|
|
path,
|
|
formatSize(usedSpace),
|
|
formatSize(freeSpace));
|
|
} else {
|
|
return path;
|
|
}
|
|
}
|
|
|
|
private String formatSize(long size) {
|
|
if (size < 1024) {
|
|
return size + " B";
|
|
} else if (size < 1024L * 1024) {
|
|
return String.format("%.1f KB", size / 1024.0);
|
|
} else if (size < 1024L * 1024 * 1024) {
|
|
return String.format("%.1f MB", size / (1024.0 * 1024.0));
|
|
} else if (size < 1024L * 1024 * 1024 * 1024) {
|
|
return String.format("%.1f GB", size / (1024.0 * 1024.0 * 1024.0));
|
|
} else {
|
|
return String.format("%.1f TB", size / (1024.0 * 1024.0 * 1024.0 * 1024.0));
|
|
}
|
|
}
|
|
}
|
|
}
|