ServerFileBrowser class

Пакет: com.hypixel.hytale.server.core.ui.browser

Файл: com/hypixel/hytale/server/core/ui/browser/ServerFileBrowser.java

Поля (94)

МодификаторыТипИмя
final HytaleLogger LOGGER
List var1
final List var1
List var1
List var1
Path var1
String var10
String var10
String var11
AssetPack var11
String var12
AssetPack var12
Path var12
boolean var13
String var14
boolean var15
String[] var19
String var2
var2
var2
var2
var2
String var2
Path var2
Object2IntMap var2
String var2
boolean var2
String var2
String var2
PluginManifest var2
Predicate var2
String[] var2
Path var2
Path var2
String var20
String var21
AssetPack var22
ObjectArrayList var3
String var3
List var3
Path var3
String var3
Path var3
boolean var3
String[] var3
String var3
String var3x
String var3x
String[] var4
int var4
Path var4
String var4
String var4
String var4
int var4x
String var4x
String var5
Path var5
var5
String var5
String var5
Path var5
Path var5
Path var5
int var5
String var5
AssetPack var5
String var6
String var6
String var6
String var6
String var6
String var6
Path var6
AssetPack var6
Path var6
String var7
boolean var7
boolean var7
int var7
Path var7
Path var7
String var7
String var7
Path var7
String var8
String var8
Path var8
Path var8
String var8
Path var8
String var9
String[] var9
Path var9

Методы (49)

МодификаторыВозвратСигнатура
private record AssetPackSearchResultrecord AssetPackSearchResult(@Nonnull String virtualPath, @Nonnull String displayName, int score, boolean isTerminal)
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("Invalid path")
public void addSelectionvoid addSelection(@Nonnull String var1)
private List<FileListProvider.FileEntry> buildAssetPackListingList<FileListProvider.FileEntry> buildAssetPackListing()
private List<FileListProvider.FileEntry> buildAssetPackSearchResultsList<FileListProvider.FileEntry> buildAssetPackSearchResults()
public void buildCurrentPathvoid buildCurrentPath(@Nonnull UICommandBuilder var1)
private List<FileListProvider.FileEntry> buildDirectoryListingList<FileListProvider.FileEntry> buildDirectoryListing()
public void buildFileListvoid buildFileList(@Nonnull UICommandBuilder var1, @Nonnull UIEventBuilder var2)
public void buildRootSelectorvoid buildRootSelector(@Nonnull UICommandBuilder var1, @Nonnull UIEventBuilder var2)
public void buildSearchInputvoid buildSearchInput(@Nonnull UICommandBuilder var1, @Nonnull UIEventBuilder var2)
private List<FileListProvider.FileEntry> buildSearchResultsList<FileListProvider.FileEntry> buildSearchResults()
public void buildUIvoid buildUI(@Nonnull UICommandBuilder var1, @Nonnull UIEventBuilder var2)
public void clearSelectionvoid clearSelection()
for for(FileListProvider.FileEntry var6 : var3)
for for(Path var5 : var3)
for for(Path var4 : var1)
for for(Path var11 : var9)
private boolean handleAssetPackNavigationboolean handleAssetPackNavigation(@Nonnull String var1)
public boolean handleEventboolean handleEvent(@Nonnull FileBrowserEventData var1)
if if(var3 != null)
if if(var5 == null)
if if(var7 > 0)
if if(var22 != null)
if if(var7 != null)
if if(var2 != var3)
if if(var12 != null)
if if(var7 != null)
if if(var4x > 0)
if if(var5 > 0)
if if(var11 != null)
if if(var6 == null)
if if(var7 == null)
if if(var8 == null)
if if(var9 == null)
if if(var5 == null)
if if(var6 == null)
private boolean isTerminalDirectoryboolean isTerminalDirectory(@Nonnull Path var1)
private boolean matchesExtensionboolean matchesExtension(@Nonnull String var1)
public void navigateTovoid navigateTo(@Nonnull Path var1)
public void navigateUpvoid navigateUp()
public FileVisitResult preVisitDirectorypublic FileVisitResult preVisitDirectory(@Nonnull Path var1x, @Nonnull BasicFileAttributes var2x)
private String removeExtensionsString removeExtensions(@Nonnull String var1)
private void searchInAssetPackDirectoryvoid searchInAssetPackDirectory(@Nonnull final Path var1, @Nonnull final String var2, @Nonnull final String var3, @Nonnull final List<ServerFileBrowser.AssetPackSearchResult> var4)
public void setCurrentDirvoid setCurrentDir(@Nonnull Path var1)
public void setRootvoid setRoot(@Nonnull Path var1)
public void setSearchQueryvoid setSearchQuery(@Nonnull String var1)
abstract this this(var1)
public FileVisitResult visitFilepublic FileVisitResult visitFile(@Nonnull Path var1x, @Nonnull BasicFileAttributes var2)
public FileVisitResult visitFilepublic FileVisitResult visitFile(@Nonnull Path var1x, @Nonnull BasicFileAttributes var2x)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.ui.browser;

class="kw">import com.hypixel.hytale.assetstore.AssetPack;
class="kw">import com.hypixel.hytale.common.plugin.PluginManifest;
class="kw">import com.hypixel.hytale.common.util.PathUtil;
class="kw">import com.hypixel.hytale.common.util.StringCompareUtil;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.protocol.packets.interface_.CustomUIEventBindingType;
class="kw">import com.hypixel.hytale.server.core.asset.AssetModule;
class="kw">import com.hypixel.hytale.server.core.ui.DropdownEntryInfo;
class="kw">import com.hypixel.hytale.server.core.ui.Value;
class="kw">import com.hypixel.hytale.server.core.ui.builder.EventData;
class="kw">import com.hypixel.hytale.server.core.ui.builder.UICommandBuilder;
class="kw">import com.hypixel.hytale.server.core.ui.builder.UIEventBuilder;
class="kw">import it.unimi.dsi.fastutil.objects.Object2IntMap;
class="kw">import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import java.io.IOException;
class="kw">import java.nio.file.DirectoryStream;
class="kw">import java.nio.file.FileVisitResult;
class="kw">import java.nio.file.Files;
class="kw">import java.nio.file.Path;
class="kw">import java.nio.file.Paths;
class="kw">import java.nio.file.SimpleFileVisitor;
class="kw">import java.nio.file.attribute.BasicFileAttributes;
class="kw">import java.util.Collections;
class="kw">import java.util.Comparator;
class="kw">import java.util.LinkedHashSet;
class="kw">import java.util.List;
class="kw">import java.util.Locale;
class="kw">import java.util.Set;
class="kw">import java.util.function.Predicate;
class="kw">import java.util.stream.Collectors;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class ServerFileBrowser {
   class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   class="kw">private class="kw">static class="kw">final Value<String> BUTTON_HIGHLIGHTED = Value.ref("Pages/BasicTextButton.ui", "SelectedLabelStyle");
   class="kw">private class="kw">static class="kw">final String BASE_ASSET_PACK_DISPLAY_NAME = "HytaleAssets";
   @Nonnull
   class="kw">private class="kw">final FileBrowserConfig config;
   @Nonnull
   class="kw">private Path root;
   @Nonnull
   class="kw">private Path currentDir;
   @Nonnull
   class="kw">private String searchQuery;
   @Nonnull
   class="kw">private class="kw">final Set<String> selectedItems;

   class="kw">public ServerFileBrowser(@Nonnull FileBrowserConfig var1) {
      this.config = var1;
      this.selectedItems = new LinkedHashSet<>();
      this.searchQuery = "";
      if (!var1.roots().isEmpty()) {
         this.root = var1.roots().get(0).path();
      } else {
         this.root = Paths.get("");
      }

      this.currentDir = this.root.getFileSystem().getPath("");
   }

   class="kw">public ServerFileBrowser(@Nonnull FileBrowserConfig var1, @Nullable Path var2, @Nullable Path var3) {
      this(var1);
      if (var2 != null && Files.isDirectory(var2)) {
         this.root = var2;
         this.currentDir = this.root.getFileSystem().getPath("");
      }

      if (var3 != null) {
         this.currentDir = var3;
      }
   }

   class="kw">public void buildRootSelector(@Nonnull UICommandBuilder var1, @Nonnull UIEventBuilder var2) {
      if (this.config.enableRootSelector() && this.config.rootSelectorId() != null) {
         ObjectArrayList var3 = new ObjectArrayList();

         for (FileBrowserConfig.RootEntry var5 : this.config.roots()) {
            var3.add(new DropdownEntryInfo(var5.displayName(), var5.path().toString()));
         }

         var1.set(this.config.rootSelectorId() + ".Entries", var3);
         var1.set(this.config.rootSelectorId() + ".Value", this.root.toString());
         var2.addEventBinding(
            CustomUIEventBindingType.ValueChanged,
            this.config.rootSelectorId(),
            new EventData().append("@Root", this.config.rootSelectorId() + ".Value"),
            false
         );
      } else {
         if (this.config.rootSelectorId() != null) {
            var1.set(this.config.rootSelectorId() + ".Visible", false);
         }
      }
   }

   class="kw">public void buildSearchInput(@Nonnull UICommandBuilder var1, @Nonnull UIEventBuilder var2) {
      if (this.config.enableSearch() && this.config.searchInputId() != null) {
         var1.set(this.config.searchInputId() + ".Value", this.searchQuery);
         var2.addEventBinding(
            CustomUIEventBindingType.ValueChanged, this.config.searchInputId(), EventData.of("@SearchQuery", this.config.searchInputId() + ".Value"), false
         );
      }
   }

   class="kw">public void buildCurrentPath(@Nonnull UICommandBuilder var1) {
      if (this.config.currentPathId() != null) {
         String var2;
         if (this.config.assetPackMode()) {
            String var3 = this.currentDir.toString().replace('\\', '/');
            if (var3.isEmpty()) {
               var2 = "Assets";
            } else {
               String[] var4 = var3.split("/", 2);
               String var5 = var4[0];
               String var6 = var4.length > 1 ? "/" + var4[1] : "";
               if ("HytaleAssets".equals(var5)) {
                  var2 = var5 + var6;
               } else {
                  var2 = "Mods/" + var5 + var6;
               }
            }
         } else {
            String var7 = this.root.toString().replace("\\", "/");
            String var8 = this.currentDir.toString().isEmpty() ? "" : "/" + this.currentDir.toString().replace("\\", "/");
            var2 = var7 + var8;
         }

         var1.set(this.config.currentPathId() + ".Text", var2);
      }
   }

   @Nonnull
   class="kw">public List<FileListProvider.FileEntry> getFileEntries() {
      if (this.config.customProvider() != null) {
         class="kw">return this.config.customProvider().getFiles(this.currentDir, this.searchQuery);
      } else if (this.config.assetPackMode()) {
         class="kw">return !this.searchQuery.isEmpty() && this.config.enableSearch() ? this.buildAssetPackSearchResults() : this.buildAssetPackListing();
      } else {
         class="kw">return !this.searchQuery.isEmpty() && this.config.enableSearch() ? this.buildSearchResults() : this.buildDirectoryListing();
      }
   }

   class="kw">public void buildFileList(@Nonnull UICommandBuilder var1, @Nonnull UIEventBuilder var2) {
      var1.clear(this.config.listElementId());
      List var3 = this.getFileEntries();
      int var4 = 0;
      if (this.config.enableDirectoryNav() && !this.currentDir.toString().isEmpty() && this.searchQuery.isEmpty()) {
         var1.append(this.config.listElementId(), "Pages/BasicTextButton.ui");
         var1.set(this.config.listElementId() + "[0].Text", "../");
         var2.addEventBinding(CustomUIEventBindingType.Activating, this.config.listElementId() + "[0]", EventData.of("File", ".."));
         var4++;
      }

      for (FileListProvider.FileEntry var6 : var3) {
         boolean var7 = var6.isDirectory() && !var6.isTerminal();
         String var8 = var7 ? var6.displayName() + "/" : var6.displayName();
         var1.append(this.config.listElementId(), "Pages/BasicTextButton.ui");
         var1.set(this.config.listElementId() + "[" + var4 + "].Text", var8);
         if (!var6.isDirectory() || var6.isTerminal()) {
            var1.set(this.config.listElementId() + "[" + var4 + "].Style", BUTTON_HIGHLIGHTED);
         }

         String var9 = !this.searchQuery.isEmpty() && !var7 ? "SearchResult" : "File";
         var2.addEventBinding(CustomUIEventBindingType.Activating, this.config.listElementId() + "[" + var4 + "]", EventData.of(var9, var6.name()));
         var4++;
      }
   }

   class="kw">public void buildUI(@Nonnull UICommandBuilder var1, @Nonnull UIEventBuilder var2) {
      this.buildRootSelector(var1, var2);
      this.buildSearchInput(var1, var2);
      this.buildCurrentPath(var1);
      this.buildFileList(var1, var2);
   }

   class="kw">public boolean handleEvent(@Nonnull FileBrowserEventData var1) {
      if (var1.getSearchQuery() != null) {
         this.searchQuery = var1.getSearchQuery().trim().toLowerCase(Locale.ROOT);
         class="kw">return true;
      }

      if (var1.getRoot() != null) {
         Path var5 = this.findConfigRoot(var1.getRoot());
         if (var5 == null) {
            var5 = Path.of(var1.getRoot());
         }

         this.setRoot(var5);
         this.currentDir = this.root.getFileSystem().getPath("");
         this.searchQuery = "";
         class="kw">return true;
      } else if (var1.getFile() != null) {
         String var2 = var1.getFile();
         if ("..".equals(var2)) {
            this.navigateUp();
            class="kw">return true;
         }

         if (this.config.assetPackMode()) {
            class="kw">return this.handleAssetPackNavigation(var2);
         }

         if (this.config.enableDirectoryNav()) {
            Path var3 = this.root.resolve(this.currentDir.toString());
            Path var4 = PathUtil.resolvePathWithinDir(var3, var2);
            if (var4 != null && Files.isDirectory(var4) && PathUtil.isChildOf(this.root, var4)) {
               this.currentDir = PathUtil.relativize(this.root, var4);
               class="kw">return true;
            }
         }

         class="kw">return false;
      } else {
         class="kw">return var1.getSearchResult() != null ? false : false;
      }
   }

   class="kw">private List<FileListProvider.FileEntry> buildDirectoryListing() {
      List var1 = new ObjectArrayList();
      Path var2 = this.root.resolve(this.currentDir.toString());
      if (!Files.isDirectory(var2)) {
         class="kw">return var1;
      }

      try (DirectoryStream var3 = Files.newDirectoryStream(var2)) {
         for (Path var5 : var3) {
            String var6 = var5.getFileName().toString();
            if (!var6.startsWith(".")) {
               boolean var7 = Files.isDirectory(var5);
               if (var7 || this.matchesExtension(var6)) {
                  var1.add(new FileListProvider.FileEntry(var6, var7));
               }
            }
         }
      } catch (IOException var10) {
         ((HytaleLogger.Api)((HytaleLogger.Api)LOGGER.atSevere()).withCause(var10)).log("Error listing directory: %s", var2);
      }

      var1.sort((var0, var1x) -> {
         if (var0.isDirectory() == var1x.isDirectory()) {
            class="kw">return var0.name().compareToIgnoreCase(var1x.name());
         } else {
            class="kw">return var0.isDirectory() ? -1 : 1;
         }
      });
      class="kw">return var1;
   }

   class="kw">private List<FileListProvider.FileEntry> buildSearchResults() {
      class="kw">final List var1 = new ObjectArrayList();
      if (!Files.isDirectory(this.root)) {
         class="kw">return List.of();
      }

      try {
         Files.walkFileTree(this.root, new SimpleFileVisitor<Path>() {
            @Nonnull
            class="kw">public FileVisitResult visitFile(@Nonnull Path var1x, @Nonnull BasicFileAttributes var2) {
               String var3 = var1x.getFileName().toString();
               if (ServerFileBrowser.this.matchesExtension(var3)) {
                  var1.add(var1x);
               }

               class="kw">return FileVisitResult.CONTINUE;
            }
         });
      } catch (IOException var8) {
         ((HytaleLogger.Api)((HytaleLogger.Api)LOGGER.atSevere()).withCause(var8)).log("Error walking directory: %s", this.root);
      }

      Object2IntMap var2 = new Object2IntOpenHashMap(var1.size());

      for (Path var4 : var1) {
         String var5 = var4.getFileName().toString();
         String var6 = this.removeExtensions(var5);
         int var7 = StringCompareUtil.getFuzzyDistance(var6, this.searchQuery, Locale.ENGLISH);
         if (var7 > 0) {
            var2.put(var4, var7);
         }
      }

      class="kw">return var2.keySet().stream().sorted(Comparator.comparingInt(var2::getInt).reversed()).limit(this.config.maxResults()).map(var2x -> {
         Path var3 = PathUtil.relativize(this.root, var2x);
         String var4 = var2x.getFileName().toString();
         String var5 = this.removeExtensions(var4);
         class="kw">return new FileListProvider.FileEntry(var3.toString(), var5, false, false, var2.getInt(var2x));
      }).collect(Collectors.toList());
   }

   class="kw">private boolean matchesExtension(@Nonnull String var1) {
      if (this.config.allowedExtensions().isEmpty()) {
         class="kw">return true;
      }

      for (String var3 : this.config.allowedExtensions()) {
         if (var1.endsWith(var3)) {
            class="kw">return true;
         }
      }

      class="kw">return false;
   }

   class="kw">private List<FileListProvider.FileEntry> buildAssetPackListing() {
      List var1 = new ObjectArrayList();
      String var2 = this.currentDir.toString().replace('\\', '/');
      if (var2.isEmpty()) {
         for (AssetPack var4 : AssetModule.get().getAssetPacks()) {
            Path var5 = this.getAssetPackSubPath(var4);
            if (var5 != null && Files.isDirectory(var5)) {
               String var6 = this.getAssetPackDisplayName(var4);
               var1.add(new FileListProvider.FileEntry(var6, var6, true));
            }
         }
      } else {
         String[] var19 = var2.split("/", 2);
         String var20 = var19[0];
         String var21 = var19.length > 1 ? var19[1] : "";
         AssetPack var22 = this.findAssetPackByDisplayName(var20);
         if (var22 != null) {
            Path var7 = this.getAssetPackSubPath(var22);
            if (var7 != null) {
               Path var8 = var21.isEmpty() ? var7 : PathUtil.resolvePathWithinDir(var7, var21);
               if (var8 != null && Files.isDirectory(var8)) {
                  try (DirectoryStream var9 = Files.newDirectoryStream(var8)) {
                     for (Path var11 : var9) {
                        String var12 = var11.getFileName().toString();
                        if (!var12.startsWith(".")) {
                           boolean var13 = Files.isDirectory(var11);
                           if (var13 || this.matchesExtension(var12)) {
                              String var14 = var13 ? var12 : this.removeExtensions(var12);
                              boolean var15 = var13 && this.isTerminalDirectory(var11);
                              var1.add(new FileListProvider.FileEntry(var12, var14, var13, var15));
                           }
                        }
                     }
                  } catch (IOException var18) {
                     ((HytaleLogger.Api)((HytaleLogger.Api)LOGGER.atSevere()).withCause(var18)).log("Error listing asset pack directory: %s", var8);
                  }
               }
            }
         }
      }

      var1.sort((var0, var1x) -> {
         boolean var2 = "HytaleAssets".equals(var0.name());
         boolean var3 = "HytaleAssets".equals(var1x.name());
         if (var2 != var3) {
            class="kw">return var2 ? -1 : 1;
         } else if (var0.isDirectory() == var1x.isDirectory()) {
            class="kw">return var0.displayName().compareToIgnoreCase(var1x.displayName());
         } else {
            class="kw">return var0.isDirectory() ? -1 : 1;
         }
      });
      class="kw">return var1;
   }

   class="kw">private List<FileListProvider.FileEntry> buildAssetPackSearchResults() {
      List var1 = new ObjectArrayList();
      String var2 = this.currentDir.toString().replace('\\', '/');
      if (var2.isEmpty()) {
         for (AssetPack var4 : AssetModule.get().getAssetPacks()) {
            Path var5 = this.getAssetPackSubPath(var4);
            if (var5 != null && Files.isDirectory(var5)) {
               String var6 = this.getAssetPackDisplayName(var4);
               this.searchInAssetPackDirectory(var5, var6, "", var1);
            }
         }
      } else {
         String[] var9 = var2.split("/", 2);
         String var10 = var9[0];
         String var11 = var9.length > 1 ? var9[1] : "";
         AssetPack var12 = this.findAssetPackByDisplayName(var10);
         if (var12 != null) {
            Path var7 = this.getAssetPackSubPath(var12);
            if (var7 != null) {
               Path var8 = var11.isEmpty() ? var7 : PathUtil.resolvePathWithinDir(var7, var11);
               if (var8 != null && Files.isDirectory(var8)) {
                  this.searchInAssetPackDirectory(var8, var10, var11, var1);
               }
            }
         }
      }

      var1.sort(Comparator.comparingInt(ServerFileBrowser.AssetPackSearchResult::score).reversed());
      class="kw">return var1.stream()
         .limit(this.config.maxResults())
         .map(var0 -> new FileListProvider.FileEntry(var0.virtualPath(), var0.displayName(), var0.isTerminal(), var0.isTerminal(), var0.score()))
         .collect(Collectors.toList());
   }

   class="kw">private void searchInAssetPackDirectory(
      @Nonnull class="kw">final Path var1, @Nonnull class="kw">final String var2, @Nonnull class="kw">final String var3, @Nonnull class="kw">final List<ServerFileBrowser.AssetPackSearchResult> var4
   ) {
      try {
         Files.walkFileTree(var1, new SimpleFileVisitor<Path>() {
            @Nonnull
            class="kw">public FileVisitResult preVisitDirectory(@Nonnull Path var1x, @Nonnull BasicFileAttributes var2x) {
               if (var1x.equals(var1)) {
                  class="kw">return FileVisitResult.CONTINUE;
               }

               if (ServerFileBrowser.this.isTerminalDirectory(var1x)) {
                  String var3x = var1x.getFileName().toString();
                  int var4x = StringCompareUtil.getFuzzyDistance(var3x.toLowerCase(Locale.ROOT), ServerFileBrowser.this.searchQuery, Locale.ENGLISH);
                  if (var4x > 0) {
                     Path var5 = var1.relativize(var1x);
                     String var6 = var5.toString().replace('\\', '/');
                     String var7 = var3.isEmpty() ? var2 + "/" + var6 : var2 + "/" + var3 + "/" + var6;
                     var4.add(new ServerFileBrowser.AssetPackSearchResult(var7, var3x, var4x, true));
                  }

                  class="kw">return FileVisitResult.SKIP_SUBTREE;
               } else {
                  class="kw">return FileVisitResult.CONTINUE;
               }
            }

            @Nonnull
            class="kw">public FileVisitResult visitFile(@Nonnull Path var1x, @Nonnull BasicFileAttributes var2x) {
               String var3x = var1x.getFileName().toString();
               if (ServerFileBrowser.this.matchesExtension(var3x)) {
                  String var4x = ServerFileBrowser.this.removeExtensions(var3x);
                  int var5 = StringCompareUtil.getFuzzyDistance(var4x.toLowerCase(Locale.ROOT), ServerFileBrowser.this.searchQuery, Locale.ENGLISH);
                  if (var5 > 0) {
                     Path var6 = var1.relativize(var1x);
                     String var7 = var6.toString().replace('\\', '/');
                     String var8 = var3.isEmpty() ? var2 + "/" + var7 : var2 + "/" + var3 + "/" + var7;
                     var4.add(new ServerFileBrowser.AssetPackSearchResult(var8, var4x, var5, false));
                  }
               }

               class="kw">return FileVisitResult.CONTINUE;
            }
         });
      } catch (IOException var6) {
         ((HytaleLogger.Api)((HytaleLogger.Api)LOGGER.atSevere()).withCause(var6)).log("Error searching asset pack directory: %s", var1);
      }
   }

   class="kw">private boolean handleAssetPackNavigation(@Nonnull String var1) {
      String var2 = this.currentDir.toString().replace('\\', '/');
      if (var2.isEmpty()) {
         AssetPack var11 = this.findAssetPackByDisplayName(var1);
         if (var11 != null) {
            Path var12 = this.getAssetPackSubPath(var11);
            if (var12 != null && Files.isDirectory(var12)) {
               this.currentDir = Paths.get(var1);
               class="kw">return true;
            }
         }

         class="kw">return false;
      } else {
         String[] var3 = var2.split("/", 2);
         String var4 = var3[0];
         String var5 = var3.length > 1 ? var3[1] : "";
         AssetPack var6 = this.findAssetPackByDisplayName(var4);
         if (var6 == null) {
            class="kw">return false;
         }

         Path var7 = this.getAssetPackSubPath(var6);
         if (var7 == null) {
            class="kw">return false;
         }

         Path var8 = var5.isEmpty() ? var7 : PathUtil.resolvePathWithinDir(var7, var5);
         if (var8 == null) {
            class="kw">return false;
         }

         Path var9 = PathUtil.resolvePathWithinDir(var8, var1);
         if (var9 == null) {
            class="kw">return false;
         }

         if (Files.isDirectory(var9)) {
            if (this.isTerminalDirectory(var9)) {
               class="kw">return false;
            }

            String var10 = var5.isEmpty() ? var4 + "/" + var1 : var4 + "/" + var5 + "/" + var1;
            this.currentDir = Paths.get(var10);
            class="kw">return true;
         } else {
            class="kw">return false;
         }
      }
   }

   @Nullable
   class="kw">private Path getAssetPackSubPath(@Nonnull AssetPack var1) {
      class="kw">return this.config.assetPackSubPath() == null ? null : var1.getRoot().resolve(this.config.assetPackSubPath());
   }

   @Nonnull
   class="kw">private String getAssetPackDisplayName(@Nonnull AssetPack var1) {
      if (var1.equals(AssetModule.get().getBaseAssetPack())) {
         class="kw">return "HytaleAssets";
      }

      PluginManifest var2 = var1.getManifest();
      class="kw">return var2 != null ? var2.getName() : var1.getName();
   }

   @Nullable
   class="kw">private AssetPack findAssetPackByDisplayName(@Nonnull String var1) {
      for (AssetPack var3 : AssetModule.get().getAssetPacks()) {
         if (this.getAssetPackDisplayName(var3).equals(var1)) {
            class="kw">return var3;
         }
      }

      class="kw">return null;
   }

   class="kw">private boolean isTerminalDirectory(@Nonnull Path var1) {
      Predicate var2 = this.config.terminalDirectoryPredicate();
      class="kw">return var2 != null && var2.test(var1);
   }

   @Nullable
   class="kw">public Path resolveAssetPackPath(@Nonnull String var1) {
      if (this.config.assetPackMode() && !var1.isEmpty()) {
         String[] var2 = var1.replace('\\', '/').split("/", 2);
         String var3 = var2[0];
         String var4 = var2.length > 1 ? var2[1] : "";
         AssetPack var5 = this.findAssetPackByDisplayName(var3);
         if (var5 == null) {
            class="kw">return null;
         } else {
            Path var6 = this.getAssetPackSubPath(var5);
            if (var6 == null) {
               class="kw">return null;
            } else {
               class="kw">return var4.isEmpty() ? var6 : PathUtil.resolvePathWithinDir(var6, var4);
            }
         }
      } else {
         class="kw">return null;
      }
   }

   @Nonnull
   class="kw">public String getAssetPackCurrentPath() {
      class="kw">return this.currentDir.toString().replace('\\', '/');
   }

   class="kw">private String removeExtensions(@Nonnull String var1) {
      for (String var3 : this.config.allowedExtensions()) {
         if (var1.endsWith(var3)) {
            class="kw">return var1.substring(0, var1.length() - var3.length());
         }
      }

      class="kw">return var1;
   }

   @Nonnull
   class="kw">public Path getRoot() {
      class="kw">return this.root;
   }

   class="kw">public void setRoot(@Nonnull Path var1) {
      this.root = var1;
   }

   @Nonnull
   class="kw">public Path getCurrentDir() {
      class="kw">return this.currentDir;
   }

   class="kw">public void setCurrentDir(@Nonnull Path var1) {
      Path var2 = this.root.resolve(var1.toString());
      if (!PathUtil.isChildOf(this.root, var2)) {
         throw new IllegalArgumentException("Invalid path");
      }

      this.currentDir = var1;
   }

   @Nonnull
   class="kw">public String getSearchQuery() {
      class="kw">return this.searchQuery;
   }

   class="kw">public void setSearchQuery(@Nonnull String var1) {
      this.searchQuery = var1;
   }

   class="kw">public void navigateUp() {
      if (!this.currentDir.toString().isEmpty()) {
         Path var1 = this.currentDir.getParent();
         this.currentDir = var1 != null ? var1 : Paths.get("");
      }
   }

   class="kw">public void navigateTo(@Nonnull Path var1) {
      Path var2 = this.root.resolve(this.currentDir.toString()).resolve(var1.toString());
      if (PathUtil.isChildOf(this.root, var2)) {
         if (Files.isDirectory(var2)) {
            this.currentDir = PathUtil.relativize(this.root, var2);
         }
      }
   }

   @Nonnull
   class="kw">public Set<String> getSelectedItems() {
      class="kw">return Collections.unmodifiableSet(this.selectedItems);
   }

   class="kw">public void addSelection(@Nonnull String var1) {
      if (this.config.enableMultiSelect()) {
         this.selectedItems.add(var1);
      } else {
         this.selectedItems.clear();
         this.selectedItems.add(var1);
      }
   }

   class="kw">public void clearSelection() {
      this.selectedItems.clear();
   }

   @Nonnull
   class="kw">public FileBrowserConfig getConfig() {
      class="kw">return this.config;
   }

   @Nullable
   class="kw">private Path findConfigRoot(@Nonnull String var1) {
      for (FileBrowserConfig.RootEntry var3 : this.config.roots()) {
         if (var3.path().toString().equals(var1)) {
            class="kw">return var3.path();
         }
      }

      class="kw">return null;
   }

   class="kw">private record AssetPackSearchResult(@Nonnull String virtualPath, @Nonnull String displayName, int score, boolean isTerminal) {
      class="kw">private AssetPackSearchResult {
      }
   }
}