diff --git a/src/main/java/cz/kamma/kfmanager/ui/FilePanel.java b/src/main/java/cz/kamma/kfmanager/ui/FilePanel.java index ab49dc5..91dbf24 100644 --- a/src/main/java/cz/kamma/kfmanager/ui/FilePanel.java +++ b/src/main/java/cz/kamma/kfmanager/ui/FilePanel.java @@ -23,6 +23,7 @@ public class FilePanel extends JPanel { private cz.kamma.kfmanager.config.AppConfig appConfig; private Runnable onDirectoryChangedAll; private java.util.function.Consumer onTableCreated; + private java.util.function.Function driveSelectionTargetResolver; private boolean ignoreComboActions = false; private boolean active = false; @@ -39,6 +40,10 @@ public class FilePanel extends JPanel { this.onTableCreated = callback; } + public void setDriveSelectionTargetResolver(java.util.function.Function resolver) { + this.driveSelectionTargetResolver = resolver; + } + /** Start inline rename on the currently selected tab/table. */ public void startInlineRename() { FilePanelTab tab = getCurrentTab(); @@ -117,7 +122,19 @@ public class FilePanel extends JPanel { if (selObj instanceof File sel) { FilePanelTab currentTab = getCurrentTab(); if (currentTab != null) { - currentTab.loadDirectory(sel); + File targetDirectory = sel; + if (driveSelectionTargetResolver != null) { + try { + File resolved = driveSelectionTargetResolver.apply(sel); + if (resolved != null && resolved.exists() && resolved.isDirectory() && isWithinSelectedDrive(resolved, sel)) { + targetDirectory = resolved; + } + } catch (Exception ignore) { + // fall back to selected drive root + } + } + + currentTab.loadDirectory(targetDirectory); SwingUtilities.invokeLater(() -> { try { currentTab.getFileTable().requestFocusInWindow(); } catch (Exception ignore) {} }); @@ -238,6 +255,25 @@ public class FilePanel extends JPanel { } } + private boolean isWithinSelectedDrive(File directory, File selectedDrive) { + try { + java.nio.file.Path dirPath = directory.toPath().toAbsolutePath().normalize(); + java.nio.file.Path selectedPath = selectedDrive.toPath().toAbsolutePath().normalize(); + if (dirPath.startsWith(selectedPath)) { + return true; + } + + java.nio.file.Path dirRoot = dirPath.getRoot(); + java.nio.file.Path selectedRoot = selectedPath.getRoot(); + return dirRoot != null + && selectedRoot != null + && dirRoot.equals(selectedRoot) + && selectedPath.equals(selectedRoot); + } catch (Exception ex) { + return false; + } + } + /** * Show the drive dropdown popup and focus it. */ diff --git a/src/main/java/cz/kamma/kfmanager/ui/MainWindow.java b/src/main/java/cz/kamma/kfmanager/ui/MainWindow.java index 448b49a..60ef36b 100644 --- a/src/main/java/cz/kamma/kfmanager/ui/MainWindow.java +++ b/src/main/java/cz/kamma/kfmanager/ui/MainWindow.java @@ -144,10 +144,13 @@ public class MainWindow extends JFrame { // Provide a callback so tabs inside the panel can request switching panels with TAB rightPanel.setSwitchPanelCallback(() -> switchPanelsFromChild()); rightPanel.setOnDirectoryChangedAll(() -> updateCommandLinePrompt()); - rightPanel.setOnTableCreated(table -> { + rightPanel.setOnTableCreated(table -> { setupFileTable(table, rightPanel); }); setupFileTable(rightPanel.getFileTable(), rightPanel); + + leftPanel.setDriveSelectionTargetResolver(selectedDrive -> getPreferredDirectoryFromOppositePanel(selectedDrive, rightPanel)); + rightPanel.setDriveSelectionTargetResolver(selectedDrive -> getPreferredDirectoryFromOppositePanel(selectedDrive, leftPanel)); // Load and set ViewMode for right panel try { @@ -2311,6 +2314,33 @@ public class MainWindow extends JFrame { rightPanel.refresh(activePanel == rightPanel); } } + + private File getPreferredDirectoryFromOppositePanel(File selectedDrive, FilePanel oppositePanel) { + if (selectedDrive == null || oppositePanel == null) return selectedDrive; + File oppositeDirectory = oppositePanel.getCurrentDirectory(); + if (oppositeDirectory == null || !oppositeDirectory.exists() || !oppositeDirectory.isDirectory()) { + return selectedDrive; + } + return isWithinSelectedDrive(oppositeDirectory, selectedDrive) ? oppositeDirectory : selectedDrive; + } + + private boolean isWithinSelectedDrive(File directory, File selectedDrive) { + try { + java.nio.file.Path dirPath = directory.toPath().toAbsolutePath().normalize(); + java.nio.file.Path selectedPath = selectedDrive.toPath().toAbsolutePath().normalize(); + if (dirPath.startsWith(selectedPath)) { + return true; + } + java.nio.file.Path dirRoot = dirPath.getRoot(); + java.nio.file.Path selectedRoot = selectedPath.getRoot(); + return dirRoot != null + && selectedRoot != null + && dirRoot.equals(selectedRoot) + && selectedPath.equals(selectedRoot); + } catch (Exception ex) { + return false; + } + } /** * Set the view mode for the active panel