diff --git a/src/main/java/net/rptools/maptool/client/ui/MapPropertiesDialog.java b/src/main/java/net/rptools/maptool/client/ui/MapPropertiesDialog.java index b070800e9d..1f8cccaafd 100644 --- a/src/main/java/net/rptools/maptool/client/ui/MapPropertiesDialog.java +++ b/src/main/java/net/rptools/maptool/client/ui/MapPropertiesDialog.java @@ -32,6 +32,7 @@ import java.io.File; import java.io.IOException; import java.util.List; +import java.util.Set; import javax.swing.AbstractAction; import javax.swing.BorderFactory; import javax.swing.DefaultComboBoxModel; @@ -55,7 +56,9 @@ import net.rptools.maptool.client.AppPreferences; import net.rptools.maptool.client.MapTool; import net.rptools.maptool.client.MapToolUtil; +import net.rptools.maptool.client.ui.assetpanel.AssetDirectory; import net.rptools.maptool.client.ui.assetpanel.AssetPanel; +import net.rptools.maptool.client.ui.assetpanel.AssetPanelModel; import net.rptools.maptool.model.Asset; import net.rptools.maptool.model.AssetManager; import net.rptools.maptool.model.Grid; @@ -159,11 +162,14 @@ public void actionPerformed(ActionEvent e) { }); // Color picker paintChooser = new PaintChooser(); + AssetPanelModel model = new AssetPanelModel(); + Set assetRootList = AppPreferences.getAssetRoots(); + for (File file : assetRootList) { + model.addRootGroup(new AssetDirectory(file, AppConstants.IMAGE_FILE_FILTER)); + } + TextureChooserPanel textureChooserPanel = - new TextureChooserPanel( - paintChooser, - MapTool.getFrame().getAssetPanel().getModel(), - "mapPropertiesTextureChooser"); + new TextureChooserPanel(paintChooser, model, "mapPropertiesTextureChooser"); paintChooser.addPaintChooser(textureChooserPanel); paintChooser.setPreferredSize(new Dimension(450, 400)); mapSelectorDialog = new MapSelectorDialog(); @@ -623,11 +629,14 @@ public Asset chooseAsset() { } private JComponent createImageExplorerPanel() { + AssetPanelModel model = new AssetPanelModel(); + Set assetRootList = AppPreferences.getAssetRoots(); + for (File file : assetRootList) { + model.addRootGroup(new AssetDirectory(file, AppConstants.IMAGE_FILE_FILTER)); + } final AssetPanel assetPanel = - new AssetPanel( - "mapPropertiesImageExplorer", - MapTool.getFrame().getAssetPanel().getModel(), - JSplitPane.HORIZONTAL_SPLIT); + new AssetPanel("mapPropertiesImageExplorer", model, JSplitPane.HORIZONTAL_SPLIT); + assetPanel.addImageSelectionListener( new SelectionListener() { public void selectionPerformed(List selectedList) { diff --git a/src/main/java/net/rptools/maptool/client/ui/assetpanel/AssetPanel.java b/src/main/java/net/rptools/maptool/client/ui/assetpanel/AssetPanel.java index 95cff0107a..9880dacd86 100644 --- a/src/main/java/net/rptools/maptool/client/ui/assetpanel/AssetPanel.java +++ b/src/main/java/net/rptools/maptool/client/ui/assetpanel/AssetPanel.java @@ -69,6 +69,16 @@ public class AssetPanel extends JComponent { private Timer updateFilterTimer; private JProgressBar imagePanelProgressBar; + public boolean isLimitReached() { + return limitReached; + } + + public void setLimitReached(boolean limitReached) { + this.limitReached = limitReached; + } + + private boolean limitReached = false; + public AssetPanel(String controlName) { this(controlName, new AssetPanelModel()); } @@ -390,7 +400,7 @@ public void addAssetRoot(Directory dir) { public void setDirectory(Directory dir) { imagePanel.setModel( - new ImageFileImagePanelModel(dir) { + new ImageFileImagePanelModel(dir, this) { @Override public Transferable getTransferable(int index) { // TransferableAsset t = (TransferableAsset) super.getTransferable(index); diff --git a/src/main/java/net/rptools/maptool/client/ui/assetpanel/ImageFileImagePanelModel.java b/src/main/java/net/rptools/maptool/client/ui/assetpanel/ImageFileImagePanelModel.java index 1bac55a9b7..2cf385abf7 100644 --- a/src/main/java/net/rptools/maptool/client/ui/assetpanel/ImageFileImagePanelModel.java +++ b/src/main/java/net/rptools/maptool/client/ui/assetpanel/ImageFileImagePanelModel.java @@ -25,12 +25,10 @@ import java.io.FilenameFilter; import java.io.IOException; import java.util.ArrayList; -import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.Iterator; import java.util.List; -import java.util.ListIterator; import java.util.Set; import java.util.concurrent.Callable; import java.util.concurrent.Executors; @@ -79,10 +77,12 @@ public class ImageFileImagePanelModel implements ImagePanelModel { } } + private final AssetPanel assetPanel; + private Directory dir; private static String filter; private boolean global; - private static List fileList = new ArrayList(); + private List fileList = new ArrayList(); private List subDirList; private static int pagesProcessed = 0; @@ -90,8 +90,9 @@ public class ImageFileImagePanelModel implements ImagePanelModel { private static boolean pdfExtractIsRunning = false; private static ScheduledExecutorService extractThreadPool; - public ImageFileImagePanelModel(Directory dir) { + public ImageFileImagePanelModel(Directory dir, AssetPanel assetPanel) { this.dir = dir; + this.assetPanel = assetPanel; } public void rescan(Directory dir) { @@ -395,7 +396,7 @@ private PdfExtractor(boolean forceRescan) { pageCount = extractor.getPageCount(); extractThreadPool = Executors.newScheduledThreadPool(numThreads); - MapTool.getFrame().getAssetPanel().setImagePanelProgressMax(pageCount); + assetPanel.setImagePanelProgressMax(pageCount); } @Override @@ -403,7 +404,7 @@ protected Void doInBackground() throws Exception { try { // 0 page count means it's already been processed (or PDF if empty) if (pageCount > 0 || forceRescan) { - MapTool.getFrame().getAssetPanel().showImagePanelProgress(true); + assetPanel.showImagePanelProgress(true); for (int pageNumber = 1; pageNumber < pageCount + 1; pageNumber++) { ExtractImagesTask task = new ExtractImagesTask(pageNumber, pageCount, dir, forceRescan); @@ -470,13 +471,13 @@ private void updatePdfProgress(int progress, File tempFile) { if (progress == 0) { pagesProcessed = 0; fileListCleanup(new PdfAsDirectory(tempFile, AppConstants.IMAGE_FILE_FILTER)); - MapTool.getFrame().getAssetPanel().showImagePanelProgress(false); + assetPanel.showImagePanelProgress(false); } else { fileListCleanup(); } - MapTool.getFrame().getAssetPanel().setImagePanelProgress(pagesProcessed++); - MapTool.getFrame().getAssetPanel().updateImagePanel(); + assetPanel.setImagePanelProgress(pagesProcessed++); + assetPanel.updateImagePanel(); } private void fileListCleanup(Directory dir) { @@ -491,11 +492,10 @@ private void fileListCleanup(Directory dir) { } private void fileListCleanup() { - Set tempSet = new HashSet(); - tempSet.addAll(fileList); + Set tempSet = new HashSet(fileList); fileList.clear(); fileList.addAll(tempSet); - Collections.sort(fileList, filenameComparator); + fileList.sort(filenameComparator); } private void refreshHeroLab() { @@ -513,16 +513,11 @@ private void refreshHeroLab() { fileList.addAll(heroLabFile.extractAllCharacters(portfolioChanged)); if (filter != null && filter.length() > 0) { - for (ListIterator iter = fileList.listIterator(); iter.hasNext(); ) { - File file = iter.next(); - if (!file.getName().toUpperCase().contains(filter)) { - iter.remove(); - } - } + fileList.removeIf(file -> !file.getName().toUpperCase().contains(filter)); } - Collections.sort(fileList, filenameComparator); - MapTool.getFrame().getAssetPanel().updateGlobalSearchLabel(fileList.size()); + fileList.sort(filenameComparator); + assetPanel.updateGlobalSearchLabel(fileList.size()); } /** @@ -537,7 +532,7 @@ private void refresh() { fileList = new ArrayList(); subDirList = new ArrayList(); - if (global == true && filter != null && filter.length() > 0) { + if (global && filter != null && filter.length() > 0) { // FIXME populate fileList from all filenames in the library // Use the AssetManager class, something akin to searchForImageReferences() // but I don't want to do a search; I want to use the existing cached results. @@ -553,20 +548,16 @@ private void refresh() { fileList.addAll(dir.getFiles()); // Filter current directory of files - for (ListIterator iter = fileList.listIterator(); iter.hasNext(); ) { - File file = iter.next(); - if (!file.getName().toUpperCase().contains(filter)) { - iter.remove(); - } - } + fileList.removeIf(file -> !file.getName().toUpperCase().contains(filter)); // Now search remaining subdirectories and filter as it goes. // Stop at any time if it reaches SEARCH_LIMIT subDirList.addAll(dir.getSubDirs()); - ListFilesSwingWorker.reset(); + assetPanel.setLimitReached(false); for (Directory folder : subDirList) { - ListFilesSwingWorker workerThread = new ListFilesSwingWorker(folder.getPath()); + ListFilesSwingWorker workerThread = + new ListFilesSwingWorker(folder.getPath(), assetPanel); workerThread.execute(); } @@ -581,18 +572,13 @@ private void refresh() { } if (filter != null && filter.length() > 0) { - for (ListIterator iter = fileList.listIterator(); iter.hasNext(); ) { - File file = iter.next(); - if (!file.getName().toUpperCase().contains(filter)) { - iter.remove(); - } - } + fileList.removeIf(file -> !file.getName().toUpperCase().contains(filter)); } } - Collections.sort(fileList, filenameComparator); + fileList.sort(filenameComparator); try { - MapTool.getFrame().getAssetPanel().updateGlobalSearchLabel(fileList.size()); + assetPanel.updateGlobalSearchLabel(fileList.size()); } catch (NullPointerException e) { // This currently throws a NPE if the frame was not finished initializing when runs. For now, // lets log a message and continue. @@ -602,21 +588,18 @@ private void refresh() { } } - private static class ListFilesSwingWorker extends SwingWorker { + private class ListFilesSwingWorker extends SwingWorker { private final File folderPath; - private static boolean limitReached = false; - - private ListFilesSwingWorker(File path) { - folderPath = path; - } + private AssetPanel assetPanel; - private static void reset() { - limitReached = false; + private ListFilesSwingWorker(File path, AssetPanel assetPanel) { + this.folderPath = path; + this.assetPanel = assetPanel; } @Override protected Void doInBackground() throws Exception { - MapTool.getFrame().getAssetPanel().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + assetPanel.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); listFilesInSubDirectories(); publish(fileList.size()); return null; @@ -624,7 +607,7 @@ protected Void doInBackground() throws Exception { @Override protected void process(List integers) { - MapTool.getFrame().getAssetPanel().updateGlobalSearchLabel(fileList.size()); + assetPanel.updateGlobalSearchLabel(fileList.size()); } @Override @@ -640,9 +623,7 @@ protected void done() { // Jamz: Causes cursor to flicker due to multiple threads running. Needs a supervisior thread // to // watch over all threads. Pain to code, leave for later? Remove cursor changes? - MapTool.getFrame() - .getAssetPanel() - .setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + assetPanel.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } /* @@ -669,21 +650,21 @@ public boolean accept(File dir, String name) { }); for (final File fileEntry : files) { - if (fileEntry.getName().toUpperCase().contains(filter) && !limitReached) + if (fileEntry.getName().toUpperCase().contains(filter) && !assetPanel.isLimitReached()) fileList.add(fileEntry); if (limitReached()) break; } for (final File fileEntry : folders) { if (limitReached()) break; - ListFilesSwingWorker workerThread = new ListFilesSwingWorker(fileEntry); + ListFilesSwingWorker workerThread = new ListFilesSwingWorker(fileEntry, assetPanel); workerThread.execute(); } } private boolean limitReached() { - if (fileList.size() > AppConstants.ASSET_SEARCH_LIMIT) limitReached = true; - return limitReached; + if (fileList.size() > AppConstants.ASSET_SEARCH_LIMIT) assetPanel.setLimitReached(true); + return assetPanel.isLimitReached(); } }