mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-06-01 07:15:07 +08:00
Merge remote-tracking branch 'origin/GP-1634_dev747368_ghidrafilechooser_large_listing_windows_icons--SQUASHED'
This commit is contained in:
+28
-10
@@ -41,6 +41,16 @@ public class LocalFileChooserModel implements GhidraFileChooserModel {
|
|||||||
private FileSystemView fsView = FileSystemView.getFileSystemView();
|
private FileSystemView fsView = FileSystemView.getFileSystemView();
|
||||||
private Map<File, String> rootDescripMap = new HashMap<>();
|
private Map<File, String> rootDescripMap = new HashMap<>();
|
||||||
private Map<File, Icon> rootIconMap = new HashMap<>();
|
private Map<File, Icon> rootIconMap = new HashMap<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a cache of file icons, as returned from the OS's file icon service.
|
||||||
|
* <p>
|
||||||
|
* This cache is cleared each time a directory is requested (via {@link #getListing(File, FileFilter)}
|
||||||
|
* so that any changes to a file's icon are visible the next time the user hits
|
||||||
|
* refresh or navigates into a directory.
|
||||||
|
*/
|
||||||
|
private Map<File, Icon> fileIconMap = new HashMap<>();
|
||||||
|
|
||||||
private File[] roots = new File[0];
|
private File[] roots = new File[0];
|
||||||
private GhidraFileChooserListener listener;
|
private GhidraFileChooserListener listener;
|
||||||
|
|
||||||
@@ -177,6 +187,11 @@ public class LocalFileChooserModel implements GhidraFileChooserModel {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public File[] getListing(File directory, final FileFilter filter) {
|
public File[] getListing(File directory, final FileFilter filter) {
|
||||||
|
// This clears the previously cached icons and avoids issues with modifying the map
|
||||||
|
// while its being used by other methods by throwing away the instance and allocating
|
||||||
|
// a new one.
|
||||||
|
fileIconMap = new HashMap<>();
|
||||||
|
|
||||||
if (directory == null) {
|
if (directory == null) {
|
||||||
return new File[0];
|
return new File[0];
|
||||||
}
|
}
|
||||||
@@ -189,18 +204,21 @@ public class LocalFileChooserModel implements GhidraFileChooserModel {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Icon getIcon(File file) {
|
public Icon getIcon(File file) {
|
||||||
if (rootIconMap.containsKey(file)) {
|
Icon result = rootIconMap.get(file);
|
||||||
return rootIconMap.get(file);
|
if (result == null && file != null && file.exists()) {
|
||||||
|
result = fileIconMap.computeIfAbsent(file, this::getSystemIcon);
|
||||||
}
|
}
|
||||||
if (file != null && file.exists()) {
|
return (result != null) ? result : PROBLEM_FILE_ICON;
|
||||||
try {
|
}
|
||||||
return fsView.getSystemIcon(file);
|
|
||||||
}
|
private Icon getSystemIcon(File file) {
|
||||||
catch (Exception e) {
|
try {
|
||||||
// ignore, fall thru
|
return fsView.getSystemIcon(file);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return PROBLEM_FILE_ICON;
|
catch (Exception e) {
|
||||||
|
// ignore, return null
|
||||||
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user