/* DemoProgressBar.java (c) 2012-2013 Edward Swartz All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html */ package v9t9.gui.client.swt.shells; import java.io.IOException; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.KeyAdapter; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Scale; import org.eclipse.swt.widgets.Shell; import v9t9.common.demos.IDemoHandler; import v9t9.common.demos.IDemoHandler.IDemoListener; import v9t9.common.demos.IDemoPlayer; import v9t9.common.events.NotifyEvent; import v9t9.common.hardware.ISpeechChip; import v9t9.common.machine.IMachine; import v9t9.common.settings.Settings; import v9t9.gui.client.swt.SwtWindow; import v9t9.gui.client.swt.bars.ImageCanvas; import ejs.base.properties.IProperty; import ejs.base.settings.ISettingProperty; /** * @author ejs * */ public class DemoProgressBar extends Composite { public static final String DEMO_PROGRESS_BAR_ID = "demo.progress.bar"; private IProperty pauseProperty; private IProperty reverseProperty; private IProperty generateSpeechProperty; private IDemoListener demoListener; protected IDemoPlayer player; private long prev; private double totalTime; private int maxDemoScale; public DemoProgressBar(Shell shell, final SwtWindow window, final IMachine machine) { super(shell, SWT.NONE); shell.setText("Demo Timeline"); maxDemoScale = getDisplay().getBounds().width; GridLayoutFactory.fillDefaults().applyTo(this); pauseProperty = (ISettingProperty) Settings.get( machine, IDemoHandler.settingDemoPaused); reverseProperty = (ISettingProperty) Settings.get( machine, IDemoHandler.settingDemoReversing); generateSpeechProperty = (ISettingProperty) Settings.get( machine, ISpeechChip.settingGenerateSpeech); final Scale control = new Scale(this, SWT.HORIZONTAL); GridDataFactory.fillDefaults().grab(true, true).applyTo(control); // control.setVisible(false); // shell.setVisible(false); demoListener = new IDemoHandler.IDemoPlaybackListener() { @Override public void firedEvent(NotifyEvent event) { } @Override public void started(final IDemoPlayer player) { DemoProgressBar.this.player = player; getDisplay().syncExec(new Runnable() { public void run() { totalTime = player.getTotalTime(); control.setMaximum(maxDemoScale); int incr = Math.max(1, (int) (maxDemoScale / Math.max(1, (int) (totalTime / 1000)))); control.setIncrement(incr); control.setPageIncrement(Math.max(10, incr)); prev = System.currentTimeMillis(); } }); } @Override public void updatedPosition(final double time) { getDisplay().asyncExec(new Runnable() { public void run() { if (control.isDisposed()) return; prev = System.currentTimeMillis(); control.setSelection((int)( time * maxDemoScale / totalTime)); } }); } @Override public void stopped() { } }; machine.getDemoHandler().addListener(demoListener); control.addMouseListener(new MouseAdapter() { @Override public void mouseDown(MouseEvent e) { if (e.button == 1) { pauseProperty.setBoolean(true); } else if (e.button == 3) { if (player.getCurrentTime() == 0 && pauseProperty.getBoolean()) reverseProperty.setBoolean(false); else if (player.getCurrentTime() >= totalTime && pauseProperty.getBoolean()) reverseProperty.setBoolean(true); else reverseProperty.setBoolean(! reverseProperty.getBoolean()); } } @Override public void mouseUp(MouseEvent e) { pauseProperty.setBoolean(false); } }); control.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { long now = System.currentTimeMillis(); if (prev == 0) prev = now; if (player != null) { synchronized (player) { boolean orig = generateSpeechProperty.getBoolean(); try { //pauseProperty.setBoolean(false); generateSpeechProperty.setBoolean(false); player.seekToTime(control.getSelection() * totalTime / maxDemoScale); prev = System.currentTimeMillis(); } catch (IOException e1) { control.setSelection((int) (player.getCurrentTime() * maxDemoScale / totalTime)); } finally { generateSpeechProperty.setBoolean(orig); } } } } }); control.addKeyListener(new KeyAdapter() { /* (non-Javadoc) * @see org.eclipse.swt.events.KeyAdapter#keyPressed(org.eclipse.swt.events.KeyEvent) */ @Override public void keyPressed(KeyEvent e) { if (e.character == ' ') { pauseProperty.setBoolean(! pauseProperty.getBoolean()); } } }); addDisposeListener(new DisposeListener() { @Override public void widgetDisposed(DisposeEvent e) { machine.getDemoHandler().removeListener(demoListener); } }); getDisplay().asyncExec(new Runnable() { public void run() { Point sz = window.getShell().getSize(); Point csz = control.computeSize(sz.x, -1); getShell().setSize(sz.x, Math.max(32, csz.y)); getShell().open(); } }); } /** * @param buttonBar * @return */ public static IToolShellFactory getToolShellFactory(final ImageCanvas buttonBar, final IMachine machine, final SwtWindow window) { return new IToolShellFactory() { Behavior behavior = new Behavior(); { //behavior.boundsPref = "DemoProgressBarBounds"; behavior.centering = Centering.BELOW; behavior.centerOverControl = window.getShell(); behavior.dismissOnClickOutside = false; behavior.style = SWT.TOOL; } public Control createContents(Shell shell) { DemoProgressBar dialog = new DemoProgressBar(shell, window, machine); return dialog; } @Override public Behavior getBehavior() { return behavior; } }; } }