From 3b1065bc81861f647c5e030be3424cc8a0a3e2de Mon Sep 17 00:00:00 2001 From: rdavidek Date: Sun, 18 Jan 2026 11:59:43 +0100 Subject: [PATCH] fixed focus on restart app --- src/main/java/cz/kamma/kfmanager/MainApp.java | 1 - .../cz/kamma/kfmanager/config/AppConfig.java | 8 ++++ .../java/cz/kamma/kfmanager/ui/FilePanel.java | 43 +++++++++++++----- .../cz/kamma/kfmanager/ui/FilePanelTab.java | 36 ++++++++++++--- .../cz/kamma/kfmanager/ui/MainWindow.java | 44 +++++++++++++++---- 5 files changed, 104 insertions(+), 28 deletions(-) diff --git a/src/main/java/cz/kamma/kfmanager/MainApp.java b/src/main/java/cz/kamma/kfmanager/MainApp.java index 656fd16..f250c94 100644 --- a/src/main/java/cz/kamma/kfmanager/MainApp.java +++ b/src/main/java/cz/kamma/kfmanager/MainApp.java @@ -4,7 +4,6 @@ import cz.kamma.kfmanager.ui.MainWindow; import javax.swing.*; import java.awt.*; -import java.awt.event.AWTEventListener; import java.awt.event.KeyEvent; /** diff --git a/src/main/java/cz/kamma/kfmanager/config/AppConfig.java b/src/main/java/cz/kamma/kfmanager/config/AppConfig.java index 5e5f2bd..6d7419e 100644 --- a/src/main/java/cz/kamma/kfmanager/config/AppConfig.java +++ b/src/main/java/cz/kamma/kfmanager/config/AppConfig.java @@ -93,6 +93,14 @@ public class AppConfig { public void setWindowMaximized(boolean maximized) { properties.setProperty("window.maximized", String.valueOf(maximized)); } + + public String getActivePanel() { + return properties.getProperty("active.panel", "left"); + } + + public void setActivePanel(String panel) { + properties.setProperty("active.panel", panel); + } public String getLeftPanelPath() { return properties.getProperty("leftPanel.path", System.getProperty("user.home")); diff --git a/src/main/java/cz/kamma/kfmanager/ui/FilePanel.java b/src/main/java/cz/kamma/kfmanager/ui/FilePanel.java index 58d623f..8471547 100644 --- a/src/main/java/cz/kamma/kfmanager/ui/FilePanel.java +++ b/src/main/java/cz/kamma/kfmanager/ui/FilePanel.java @@ -21,7 +21,7 @@ public class FilePanel extends JPanel { public FilePanel(String initialPath) { initComponents(); - addNewTab(initialPath); + addNewTab(initialPath, false); } public void setOnDirectoryChangedAll(Runnable callback) { @@ -215,11 +215,15 @@ public class FilePanel extends JPanel { * Add a new tab with a directory */ public void addNewTab(String path) { + addNewTab(path, true); + } + + public void addNewTab(String path, boolean requestFocus) { // Get view mode from current tab ViewMode currentMode = getViewMode(); - FilePanelTab tab = new FilePanelTab(path); - if (appConfig != null) tab.setAppConfig(appConfig); + FilePanelTab tab = new FilePanelTab(path, requestFocus); + if (appConfig != null) tab.setAppConfig(appConfig); // Set callback for updating tab title on directory change tab.setOnDirectoryChanged(() -> { @@ -227,8 +231,8 @@ public class FilePanel extends JPanel { if (onDirectoryChangedAll != null) onDirectoryChangedAll.run(); }); - // Forward switchPanel callback to the tab so TAB works from any tab - tab.setOnSwitchPanelRequested(switchPanelCallback); + // Forward switchPanel callback to the tab so TAB works from any tab + tab.setOnSwitchPanelRequested(switchPanelCallback); // Set same view mode as current tab if (currentMode != null) { @@ -244,12 +248,13 @@ public class FilePanel extends JPanel { addMouseListenerToComponents(tab); // Update path field - updatePathField(); updateTabStyles(); // Set focus to the table in the new tab SwingUtilities.invokeLater(() -> { - tab.getFileTable().requestFocusInWindow(); + if (requestFocus) { + tab.getFileTable().requestFocusInWindow(); + } // Ensure renderers are attached now that the tab is added to the UI tab.ensureRenderers(); }); @@ -259,7 +264,11 @@ public class FilePanel extends JPanel { * Add a new tab and explicitly set the ViewMode for this tab. */ public void addNewTabWithMode(String path, ViewMode mode) { - FilePanelTab tab = new FilePanelTab(path); + addNewTabWithMode(path, mode, true); + } + + public void addNewTabWithMode(String path, ViewMode mode, boolean requestFocus) { + FilePanelTab tab = new FilePanelTab(path, requestFocus); if (appConfig != null) tab.setAppConfig(appConfig); tab.setOnDirectoryChanged(() -> { updateTabTitle(tab); @@ -282,7 +291,9 @@ public class FilePanel extends JPanel { updateTabStyles(); SwingUtilities.invokeLater(() -> { - tab.getFileTable().requestFocusInWindow(); + if (requestFocus) { + tab.getFileTable().requestFocusInWindow(); + } tab.ensureRenderers(); }); } @@ -346,6 +357,10 @@ public class FilePanel extends JPanel { * Restore the set of tabs according to specified paths and view modes. If the list is empty, nothing happens. */ public void restoreTabs(java.util.List paths, java.util.List viewModes, java.util.List focusedItems, int selectedIndex) { + restoreTabs(paths, viewModes, focusedItems, selectedIndex, true); + } + + public void restoreTabs(java.util.List paths, java.util.List viewModes, java.util.List focusedItems, int selectedIndex, boolean requestFocus) { if (paths == null || paths.isEmpty()) return; tabbedPane.removeAll(); @@ -360,13 +375,13 @@ public class FilePanel extends JPanel { mode = ViewMode.FULL; } } - addNewTabWithMode(p, mode); + addNewTabWithMode(p, mode, false); // Restore focus to the specific item if provided if (focusedItems != null && i < focusedItems.size() && focusedItems.get(i) != null) { final String focusName = focusedItems.get(i); final FilePanelTab currentTab = (FilePanelTab) tabbedPane.getComponentAt(i); - SwingUtilities.invokeLater(() -> currentTab.selectItem(focusName)); + SwingUtilities.invokeLater(() -> currentTab.selectItem(focusName, requestFocus)); } } @@ -639,9 +654,13 @@ public class FilePanel extends JPanel { } public void setViewMode(ViewMode mode) { + setViewMode(mode, true); + } + + public void setViewMode(ViewMode mode, boolean requestFocus) { FilePanelTab tab = getCurrentTab(); if (tab != null) { - tab.setViewMode(mode); + tab.setViewMode(mode, requestFocus); } } diff --git a/src/main/java/cz/kamma/kfmanager/ui/FilePanelTab.java b/src/main/java/cz/kamma/kfmanager/ui/FilePanelTab.java index 148e64e..bbc495a 100644 --- a/src/main/java/cz/kamma/kfmanager/ui/FilePanelTab.java +++ b/src/main/java/cz/kamma/kfmanager/ui/FilePanelTab.java @@ -64,9 +64,13 @@ public class FilePanelTab extends JPanel { private File currentArchiveSourceFile = null; public FilePanelTab(String initialPath) { + this(initialPath, true); + } + + public FilePanelTab(String initialPath, boolean requestFocus) { this.currentDirectory = new File(initialPath); initComponents(); - loadDirectory(currentDirectory); + loadDirectory(currentDirectory, true, requestFocus); } /** Start inline rename for currently selected item (if single selection). */ @@ -542,7 +546,7 @@ public class FilePanelTab extends JPanel { // Re-select item if (selectedItemName != null) { - selectItemByName(selectedItemName); + selectItemByName(selectedItemName, false); } }); } @@ -1411,6 +1415,10 @@ public class FilePanelTab extends JPanel { } private void selectItemByName(String name) { + selectItemByName(name, true); + } + + private void selectItemByName(String name, boolean requestFocus) { if (viewMode == ViewMode.BRIEF) { for (int i = 0; i < tableModel.items.size(); i++) { FileItem item = tableModel.items.get(i); @@ -1423,7 +1431,9 @@ public class FilePanelTab extends JPanel { fileTable.setRowSelectionInterval(row, row); fileTable.scrollRectToVisible(fileTable.getCellRect(row, column, true)); fileTable.repaint(); - fileTable.requestFocusInWindow(); + if (requestFocus) { + fileTable.requestFocusInWindow(); + } updateStatus(); } return; @@ -1435,7 +1445,9 @@ public class FilePanelTab extends JPanel { if (item != null && item.getName().equals(name)) { fileTable.setRowSelectionInterval(i, i); fileTable.scrollRectToVisible(fileTable.getCellRect(i, 0, true)); - fileTable.requestFocusInWindow(); + if (requestFocus) { + fileTable.requestFocusInWindow(); + } updateStatus(); return; } @@ -1448,7 +1460,11 @@ public class FilePanelTab extends JPanel { * Useful for other UI components to request focusing a specific file. */ public void selectItem(String name) { - selectItemByName(name); + selectItemByName(name, true); + } + + public void selectItem(String name, boolean requestFocus) { + selectItemByName(name, requestFocus); } public void toggleSelectionAndMoveDown() { @@ -1678,6 +1694,10 @@ public class FilePanelTab extends JPanel { } public void setViewMode(ViewMode mode) { + setViewMode(mode, true); + } + + public void setViewMode(ViewMode mode, boolean requestFocus) { if (this.viewMode != mode) { String selectedItemName = null; int selectedRow = fileTable.getSelectedRow(); @@ -1715,12 +1735,14 @@ public class FilePanelTab extends JPanel { fileTable.repaint(); if (itemToSelect != null) { - selectItemByName(itemToSelect); + selectItemByName(itemToSelect, requestFocus); } else if (fileTable.getRowCount() > 0) { fileTable.setRowSelectionInterval(0, 0); } - fileTable.requestFocusInWindow(); + if (requestFocus) { + fileTable.requestFocusInWindow(); + } }); } } diff --git a/src/main/java/cz/kamma/kfmanager/ui/MainWindow.java b/src/main/java/cz/kamma/kfmanager/ui/MainWindow.java index 05c89a0..5f6a04e 100644 --- a/src/main/java/cz/kamma/kfmanager/ui/MainWindow.java +++ b/src/main/java/cz/kamma/kfmanager/ui/MainWindow.java @@ -55,9 +55,18 @@ public class MainWindow extends JFrame { } }); - // After start, set focus and selection to the left panel + // After start, set focus and selection to the active panel + String initialActiveSide = config.getActivePanel(); SwingUtilities.invokeLater(() -> { - leftPanel.getFileTable().requestFocus(); + if ("right".equalsIgnoreCase(initialActiveSide)) { + activePanel = rightPanel; + rightPanel.requestFocusOnCurrentTab(); + } else { + activePanel = leftPanel; + leftPanel.requestFocusOnCurrentTab(); + } + updateActivePanelBorder(); + updateCommandLinePrompt(); }); } @@ -94,7 +103,7 @@ public class MainWindow extends JFrame { // Load and set ViewMode for left panel try { ViewMode leftViewMode = ViewMode.valueOf(config.getLeftPanelViewMode()); - leftPanel.setViewMode(leftViewMode); + leftPanel.setViewMode(leftViewMode, false); } catch (IllegalArgumentException e) { // Default value FULL is already set } @@ -111,7 +120,7 @@ public class MainWindow extends JFrame { // Load and set ViewMode for right panel try { ViewMode rightViewMode = ViewMode.valueOf(config.getRightPanelViewMode()); - rightPanel.setViewMode(rightViewMode); + rightPanel.setViewMode(rightViewMode, false); } catch (IllegalArgumentException e) { // Default value FULL is already set } @@ -121,8 +130,13 @@ public class MainWindow extends JFrame { add(mainPanel, BorderLayout.CENTER); - // Set left panel as active by default - activePanel = leftPanel; + // Restore active panel from configuration + String savedActive = config.getActivePanel(); + if ("right".equalsIgnoreCase(savedActive)) { + activePanel = rightPanel; + } else { + activePanel = leftPanel; + } updateActivePanelBorder(); updateCommandLinePrompt(); @@ -141,7 +155,7 @@ public class MainWindow extends JFrame { focusedItems.add(config.getLeftPanelTabFocusedItem(i)); } int sel = config.getLeftPanelSelectedIndex(); - leftPanel.restoreTabs(paths, modes, focusedItems, sel); + leftPanel.restoreTabs(paths, modes, focusedItems, sel, false); } } catch (Exception ex) { // ignore and keep default @@ -161,7 +175,7 @@ public class MainWindow extends JFrame { focusedItems.add(config.getRightPanelTabFocusedItem(i)); } int sel = config.getRightPanelSelectedIndex(); - rightPanel.restoreTabs(paths, modes, focusedItems, sel); + rightPanel.restoreTabs(paths, modes, focusedItems, sel, false); } } catch (Exception ex) { // ignore and keep default @@ -304,6 +318,13 @@ public class MainWindow extends JFrame { // Menu createMenuBar(); + + // Request focus for the active panel + SwingUtilities.invokeLater(() -> { + if (activePanel != null && activePanel.getFileTable() != null) { + activePanel.getFileTable().requestFocusInWindow(); + } + }); } /** @@ -1883,6 +1904,13 @@ public class MainWindow extends JFrame { // Save window state config.saveWindowState(this); + // Save active panel + if (activePanel == leftPanel) { + config.setActivePanel("left"); + } else if (activePanel == rightPanel) { + config.setActivePanel("right"); + } + // Save current panel paths (for backward compatibility) if (leftPanel.getCurrentDirectory() != null) { config.setLeftPanelPath(leftPanel.getCurrentDirectory().getAbsolutePath());