package ca.uvic.chisel.video.widget; import java.net.URI; import java.util.LinkedList; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; public abstract class AbstractVideoPlayer extends Composite { private Control control; private LinkedList<VideoListener> listeners; protected AbstractVideoPlayer(Composite parent, int style) { super(parent, style); listeners = new LinkedList<VideoListener>(); setLayout(new FillLayout()); this.control = createContents(this, style); addDisposeListener(new DisposeListener(){ @Override public void widgetDisposed(DisposeEvent e) { AbstractVideoPlayer.this.widgetDisposed(e); }}); } private void widgetDisposed(DisposeEvent e) { synchronized (listeners) { listeners.clear(); } } protected Control getControl() { return control; } protected abstract Control createContents(Composite parent, int style); public abstract void play(); public abstract void stop(); public abstract void pause(); public abstract void seek(long offset); public abstract long getTime(); public abstract void load(String location); public void addVideoListener(VideoListener listener) { synchronized (listeners) { if (!listeners.contains(listener)) { listeners.add(listener); } } } public void removeVideoListener(VideoListener listener) { synchronized (listeners) { listeners.remove(listener); } } private VideoListener[] getListeners() { synchronized (listeners) { return listeners.toArray(new VideoListener[listeners.size()]); } } /** * Fires the given event in the current thread * @param event */ protected void fireVideoEvent(VideoEvent event) { for (VideoListener listener : getListeners()) { listener.videoUpdate(event); } } /** * Asynchronously fires the given event in the display thread. * @param event */ protected void asyncFireVideoEvent(final VideoEvent event) { getDisplay().asyncExec(new Runnable(){ @Override public void run() { fireVideoEvent(event); } }); } /** * Returns the length of the video in seconds. * @return */ public abstract long getLength(); /** * Returns the number of seconds of video that have been loaded. * @return */ public abstract long getLoadProgress(); public abstract boolean isPaused(); public abstract boolean isPlaying(); public abstract boolean isStopped(); }