1313import com .ss .editor .ui .component .asset .tree .context .menu .action .*;
1414import com .ss .editor .ui .component .asset .tree .context .menu .filler .AssetTreeMultiContextMenuFiller ;
1515import com .ss .editor .ui .component .asset .tree .context .menu .filler .AssetTreeSingleContextMenuFiller ;
16- import com .ss .editor .ui .component .asset .tree .resource .FileResourceElement ;
17- import com .ss .editor .ui .component .asset .tree .resource .FolderResourceElement ;
18- import com .ss .editor .ui .component .asset .tree .resource .LoadingResourceElement ;
19- import com .ss .editor .ui .component .asset .tree .resource .ResourceElement ;
16+ import com .ss .editor .ui .component .asset .tree .resource .*;
2017import com .ss .editor .ui .util .UiUtils ;
2118import com .ss .rlib .function .IntObjectConsumer ;
2219import com .ss .rlib .util .StringUtils ;
2320import com .ss .rlib .util .array .Array ;
2421import com .ss .rlib .util .array .ArrayComparator ;
2522import com .ss .rlib .util .array .ArrayFactory ;
2623import com .ss .rlib .util .array .ConcurrentArray ;
24+ import javafx .application .Platform ;
2725import javafx .collections .FXCollections ;
2826import javafx .collections .ObservableList ;
2927import javafx .event .ActionEvent ;
@@ -67,13 +65,17 @@ public class ResourceTree extends TreeView<ResourceElement> {
6765 final int firstLevel = getLevel (first );
6866 final int secondLevel = getLevel (second );
6967
70- if (firstLevel != secondLevel ) return firstLevel - secondLevel ;
68+ if (firstLevel != secondLevel ) {
69+ return firstLevel - secondLevel ;
70+ }
7171
7272 final Path firstFile = notNull (first ).getFile ();
73- final String firstName = firstFile .getFileName ().toString ();
73+ final Path firstFileFileName = firstFile .getFileName ();
74+ final String firstName = firstFileFileName == null ? firstFile .toString () : firstFileFileName .toString ();
7475
7576 final Path secondFile = notNull (second ).getFile ();
76- final String secondName = secondFile .getFileName ().toString ();
77+ final Path secondFileName = secondFile .getFileName ();
78+ final String secondName = secondFileName == null ? secondFile .toString () : secondFileName .toString ();
7779
7880 return StringUtils .compareIgnoreCase (firstName , secondName );
7981 };
@@ -239,7 +241,10 @@ private void processChangedExpands(@NotNull final Number newValue) {
239241 }
240242
241243 final IntObjectConsumer <ResourceTree > expandHandler = getExpandHandler ();
242- if (expandHandler == null ) return ;
244+ if (expandHandler == null ) {
245+ return ;
246+ }
247+
243248 expandHandler .accept (newValue .intValue (), this );
244249 }
245250
@@ -269,7 +274,7 @@ private void lazyLoadChildren() {
269274 */
270275 @ BackgroundThread
271276 private void lazyLoadChildren (@ NotNull final TreeItem <ResourceElement > treeItem ,
272- @ Nullable final Consumer <@ NotNull TreeItem <ResourceElement >> callback ) {
277+ @ Nullable final Consumer <TreeItem <ResourceElement >> callback ) {
273278
274279 final ResourceElement element = treeItem .getValue ();
275280 final Array <ResourceElement > children = element .getChildren (extensionFilter , isOnlyFolders ());
@@ -288,10 +293,11 @@ private void lazyLoadChildren(@NotNull final TreeItem<ResourceElement> treeItem,
288293 @ FxThread
289294 private void lazyLoadChildren (@ NotNull final TreeItem <ResourceElement > treeItem ,
290295 @ NotNull final Array <ResourceElement > children ,
291- @ Nullable final Consumer <@ NotNull TreeItem <ResourceElement >> callback ) {
296+ @ Nullable final Consumer <TreeItem <ResourceElement >> callback ) {
292297
293298 final ObservableList <TreeItem <ResourceElement >> items = treeItem .getChildren ();
294299 if (items .size () != 1 || items .get (0 ).getValue () != LoadingResourceElement .getInstance ()) {
300+ if (callback != null ) callback .accept (treeItem );
295301 return ;
296302 }
297303
@@ -438,22 +444,49 @@ private boolean isReadOnly() {
438444 }
439445
440446 /**
441- * Fill the tree using the asset folder.
447+ * Fill the tree using the root folder.
442448 *
443- * @param assetFolder the asset folder.
449+ * @param rootFolder the root folder.
444450 */
445451 @ FxThread
446- public void fill (@ NotNull final Path assetFolder ) {
452+ public void fill (@ NotNull final Path rootFolder ) {
447453
448454 final Consumer <Boolean > onLoadHandler = getOnLoadHandler ();
449- if (onLoadHandler != null ) onLoadHandler .accept (Boolean .FALSE );
455+ if (onLoadHandler != null ) {
456+ onLoadHandler .accept (Boolean .FALSE );
457+ }
458+
459+ final TreeItem <ResourceElement > currentRoot = getRoot ();
460+ if (currentRoot != null ) {
461+ setRoot (null );
462+ }
463+
464+ showLoading ();
465+
466+ EXECUTOR_MANAGER .addBackgroundTask (() -> startBackgroundFill (rootFolder ));
467+ }
468+
469+ /**
470+ * Fill the tree using the list of root folders.
471+ *
472+ * @param rootFolders the list of root folder.
473+ */
474+ @ FxThread
475+ public void fill (@ NotNull final Array <Path > rootFolders ) {
476+
477+ final Consumer <Boolean > onLoadHandler = getOnLoadHandler ();
478+ if (onLoadHandler != null ) {
479+ onLoadHandler .accept (Boolean .FALSE );
480+ }
450481
451482 final TreeItem <ResourceElement > currentRoot = getRoot ();
452- if (currentRoot != null ) setRoot (null );
483+ if (currentRoot != null ) {
484+ setRoot (null );
485+ }
453486
454487 showLoading ();
455488
456- EXECUTOR_MANAGER .addBackgroundTask (() -> startBackgroundFill (assetFolder ));
489+ EXECUTOR_MANAGER .addBackgroundTask (() -> startBackgroundFill (rootFolders ));
457490 }
458491
459492 /**
@@ -554,9 +587,9 @@ private void showLoading() {
554587 * Start the background process of filling.
555588 */
556589 @ BackgroundThread
557- private void startBackgroundFill (@ NotNull final Path assetFolder ) {
590+ private void startBackgroundFill (@ NotNull final Path path ) {
558591
559- final ResourceElement rootElement = createFor (assetFolder );
592+ final ResourceElement rootElement = createFor (path );
560593 final TreeItem <ResourceElement > newRoot = new TreeItem <>(rootElement );
561594 newRoot .setExpanded (true );
562595
@@ -570,7 +603,34 @@ private void startBackgroundFill(@NotNull final Path assetFolder) {
570603 setRoot (newRoot );
571604
572605 final Consumer <Boolean > onLoadHandler = getOnLoadHandler ();
573- if (onLoadHandler != null ) onLoadHandler .accept (Boolean .TRUE );
606+ if (onLoadHandler != null ) {
607+ onLoadHandler .accept (Boolean .TRUE );
608+ }
609+ });
610+ }
611+
612+ /**
613+ * Start the background process of filling.
614+ */
615+ @ BackgroundThread
616+ private void startBackgroundFill (@ NotNull final Array <Path > paths ) {
617+
618+ final ResourceElement rootElement = new FoldersResourceElement (paths );
619+ final TreeItem <ResourceElement > newRoot = new TreeItem <>(rootElement );
620+ newRoot .setExpanded (true );
621+
622+ fill (newRoot );
623+
624+ if (!isLazyMode () && isNeedCleanup ()) {
625+ cleanup (newRoot );
626+ }
627+
628+ EXECUTOR_MANAGER .addFxTask (() -> {
629+ setRoot (newRoot );
630+ final Consumer <Boolean > onLoadHandler = getOnLoadHandler ();
631+ if (onLoadHandler != null ) {
632+ Platform .runLater (() -> onLoadHandler .accept (Boolean .TRUE ));
633+ }
574634 });
575635 }
576636
@@ -649,7 +709,9 @@ private void fill(@NotNull final TreeItem<ResourceElement> treeItem) {
649709
650710 final ResourceElement element = treeItem .getValue ();
651711 final Array <String > extensionFilter = getExtensionFilter ();
652- if (!element .hasChildren (extensionFilter , isOnlyFolders ())) return ;
712+ if (!element .hasChildren (extensionFilter , isOnlyFolders ())) {
713+ return ;
714+ }
653715
654716 final ObservableList <TreeItem <ResourceElement >> items = treeItem .getChildren ();
655717
@@ -957,7 +1019,6 @@ public void expandTo(@NotNull final Path file, final boolean needSelect) {
9571019 if (isLazyMode ()) {
9581020
9591021 final TreeItem <ResourceElement > targetItem = findItemForValue (getRoot (), file );
960-
9611022 if (targetItem == null ) {
9621023
9631024 TreeItem <ResourceElement > parentItem = null ;
@@ -968,11 +1029,12 @@ public void expandTo(@NotNull final Path file, final boolean needSelect) {
9681029 if (parentItem != null ) {
9691030 break ;
9701031 }
1032+
9711033 parent = parent .getParent ();
9721034 }
9731035
9741036 if (parentItem == null ) {
975- return ;
1037+ parentItem = getRoot () ;
9761038 }
9771039
9781040 final TreeItem <ResourceElement > toLoad = parentItem ;
0 commit comments