/** * */ package org.korsakow.ide.ui.components; import java.io.FileNotFoundException; import javax.swing.JComponent; import org.apache.log4j.Logger; import org.dsrg.soenea.domain.MapperException; import org.korsakow.domain.interf.IMedia; import org.korsakow.domain.mapper.input.ImageInputMapper; import org.korsakow.ide.resources.ResourceType; import org.korsakow.ide.resources.media.MediaFactory; import org.korsakow.ide.resources.media.Playable; import org.korsakow.ide.resources.media.PlayableImage; import org.korsakow.ide.resources.media.UnsupportedMedia; import org.korsakow.ide.util.UIUtil; public class DelayedMediaPanelLoader { public static void load(final JComponent container, final NewMediaPanel panel, IMedia media) { panel.setEnabled(false); PlayableConsumer consumer = new PlayableConsumer() { public void consume(final Playable playable) { UIUtil.runUITaskLater(new Runnable() { public void run() { panel.setPlayable(playable); panel.setEnabled(true); container.revalidate(); container.repaint(); } }); } }; if (media != null) { Long duration = null; if ( ResourceType.IMAGE.isInstance(media) ) { try { duration = ImageInputMapper.map( media.getId() ).getDuration(); } catch (MapperException e) { Logger.getLogger(DelayedMediaPanelLoader.class).error("", e); duration = 0L; } } try { String filename = media.getAbsoluteFilename(); Thread thread = new LoaderThread(consumer, filename, duration); thread.setPriority(Thread.MIN_PRIORITY); thread.start(); } catch (FileNotFoundException e) { consumer.consume(new UnsupportedMedia(media.getFilename())); } } else consumer.consume(null); } private static interface PlayableConsumer { void consume(Playable playable); } private static class LoaderThread extends Thread { private final PlayableConsumer consumer; private final String filename; private final Long duration; public LoaderThread(PlayableConsumer consumer, String filename, Long duration) { this.consumer = consumer; this.filename = filename; this.duration = duration; } @Override public void run() { // loading the media can take a while final Playable playable = MediaFactory.getMediaNoThrow(filename); if (playable instanceof PlayableImage && duration != null) ((PlayableImage)playable).setDuration(duration); consumer.consume(playable); } } }