diff --git a/src/main/java/cz/kamma/kfmanager/MainApp.java b/src/main/java/cz/kamma/kfmanager/MainApp.java index c6aaa0b..f962611 100644 --- a/src/main/java/cz/kamma/kfmanager/MainApp.java +++ b/src/main/java/cz/kamma/kfmanager/MainApp.java @@ -15,7 +15,7 @@ import java.io.InputStreamReader; */ public class MainApp { - public static final String APP_VERSION = "1.4.1"; + public static final String APP_VERSION = "1.4.2"; public enum OS { WINDOWS, LINUX, MACOS, UNKNOWN diff --git a/src/main/java/cz/kamma/kfmanager/ui/FilePanel.java b/src/main/java/cz/kamma/kfmanager/ui/FilePanel.java index a8dd700..ef22883 100644 --- a/src/main/java/cz/kamma/kfmanager/ui/FilePanel.java +++ b/src/main/java/cz/kamma/kfmanager/ui/FilePanel.java @@ -380,6 +380,45 @@ public class FilePanel extends JPanel { }); } + public void showFeedToPanel(List items) { + addNewSearchTab(items); + } + + public FilePanelTab addNewSearchTab(List items) { + ViewMode currentMode = getViewMode(); + FilePanelTab tab = new FilePanelTab(null, true); + if (appConfig != null) tab.setAppConfig(appConfig); + tab.setActive(this.active); + + tab.setOnDirectoryChanged(() -> { + updateTabTitle(tab); + if (onDirectoryChangedAll != null) onDirectoryChangedAll.run(); + }); + tab.setOnSwitchPanelRequested(switchPanelCallback); + if (onTableCreated != null) { + onTableCreated.accept(tab.getFileTable()); + } + + if (currentMode != null) { + tab.setViewMode(currentMode); + } + applyConfiguredAppearance(tab); + + tabbedPane.addTab("Search Results", tab); + tab.showFeedToPanel(items); + + tabbedPane.setSelectedComponent(tab); + addMouseListenerToComponents(tab); + updateTabStyles(); + + SwingUtilities.invokeLater(() -> { + tab.getFileTable().requestFocusInWindow(); + tab.ensureRenderers(); + }); + + return tab; + } + /** * Add a new tab and explicitly set the ViewMode for this tab. */ @@ -754,8 +793,13 @@ public class FilePanel extends JPanel { for (int i = 0; i < tabbedPane.getTabCount(); i++) { Component c = tabbedPane.getComponentAt(i); if (c instanceof FilePanelTab tab) { - File dir = tab.getCurrentDirectory(); - String title = getTabTitle(dir != null ? dir.getAbsolutePath() : ""); + String title; + if (tab.isSearchModeActive()) { + title = "Search Results"; + } else { + File dir = tab.getCurrentDirectory(); + title = getTabTitle(dir != null ? dir.getAbsolutePath() : ""); + } if (i == selectedIndex) { // Active tab: bold font @@ -1028,14 +1072,6 @@ public class FilePanel extends JPanel { } } - public void showFeedToPanel(List items) { - FilePanelTab tab = getCurrentTab(); - if (tab != null) { - tab.showFeedToPanel(items); - updatePathField(); - } - } - public void navigateUp() { FilePanelTab tab = getCurrentTab(); if (tab != null) { diff --git a/src/main/java/cz/kamma/kfmanager/ui/FilePanelTab.java b/src/main/java/cz/kamma/kfmanager/ui/FilePanelTab.java index 5ef9e48..3d7a86c 100644 --- a/src/main/java/cz/kamma/kfmanager/ui/FilePanelTab.java +++ b/src/main/java/cz/kamma/kfmanager/ui/FilePanelTab.java @@ -357,7 +357,6 @@ public class FilePanelTab extends JPanel { */ public void showFeedToPanel(List items) { searchModeActive = true; - this.currentDirectory = new File("Search results"); // Or something indicative allItems.clear(); allItems.addAll(items); @@ -1674,7 +1673,37 @@ public class FilePanelTab extends JPanel { * Refresh the current directory while attempting to preserve selection and focus. */ public void refresh(boolean requestFocus) { - if (searchModeActive) return; + if (searchModeActive) { + // In search results mode, refresh means checking if items still exist + List itemsToRemove = new ArrayList<>(); + for (FileItem item : allItems) { + if (item.getFile() != null && !item.getFile().exists()) { + itemsToRemove.add(item); + } + } + if (!itemsToRemove.isEmpty()) { + allItems.removeAll(itemsToRemove); + tableModel.setItems(new ArrayList<>(allItems)); + + if (sortColumn >= 0) { + sortItemsByColumn(sortColumn, sortAscending); + } + + if (viewMode == ViewMode.BRIEF) { + tableModel.calculateBriefLayout(); + tableModel.fireTableStructureChanged(); + } else { + tableModel.fireTableDataChanged(); + } + + updateColumnRenderers(); + updateColumnWidths(); + fileTable.revalidate(); + fileTable.repaint(); + updateStatus(); + } + return; + } if (isFtpTab) { loadFtpDirectory(ftpCurrentPath, false, requestFocus); @@ -4384,6 +4413,10 @@ public class FilePanelTab extends JPanel { return fileTable; } + public boolean isSearchModeActive() { + return searchModeActive; + } + public File getCurrentDirectory() { return currentDirectory; }