package org.limewire.ui.swing.images; import java.io.File; import java.util.HashMap; import java.util.Map; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.JList; import org.jdesktop.application.Resource; import org.limewire.collection.FixedsizeForgetfulHashMap; import org.limewire.inject.LazySingleton; import org.limewire.ui.swing.util.GuiUtils; import com.google.inject.Inject; @LazySingleton public class ThumbnailManagerImpl implements ThumbnailManager { /** * List of images that have thumbnails created already */ private final Map<File,Icon> thumbnails = new FixedsizeForgetfulHashMap<File,Icon>(2000); /** * List of images that are queued to be loaded but haven't been loaded yet */ private final Map<File, String> loading = new HashMap<File, String>(); @Resource private Icon loadIcon; @Resource private Icon errorIcon; @Inject public ThumbnailManagerImpl() { GuiUtils.assignResources(this); } @Override public Icon getThumbnailForFile(File file) { if(file == null) return null; Icon icon = thumbnails.get(file); if(icon == null) { icon = loadIcon; if(!loading.containsKey(file)) { loading.put(file, ""); ImageExecutorService.submit(new ThumbnailCallable(thumbnails, loading, file, errorIcon)); } } return icon; } @Override public Icon getThumbnailForFile(File file, JComponent callback) { if(file == null) return null; Icon icon = thumbnails.get(file); if(icon == null) { icon = loadIcon; if(!loading.containsKey(file)) { loading.put(file, ""); ImageExecutorService.submit(new ThumbnailCallable(thumbnails, loading, file, errorIcon, callback)); } } return icon; } @Override public Icon getThumbnailForFile(File file, JList list, int index) { if(file == null) return null; Icon icon = thumbnails.get(file); if(icon == null) { icon = loadIcon; if(!loading.containsKey(file)) { loading.put(file, ""); ImageExecutorService.submit(new ThumbnailCallable(thumbnails, loading, file, errorIcon, list, index)); } } return icon; } @Override public boolean isThumbnailForFileAvailable(File file) { return thumbnails.containsKey(file); } public boolean isErrorIcon(File file) { return thumbnails.containsKey(file) && thumbnails.get(file).equals(errorIcon); } }