package org.jnect.emfstore.replay;
import java.util.Observable;
import java.util.Observer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Dialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Slider;
import org.jnect.emfstore.EMFStorage;
import org.jnect.emfstore.KinectBodyPresentationManager;
public class SliderDialog extends Dialog implements Observer {
private IReplayBodyProvider replayBodyProvider;
private Slider slider;
private Label label;
private int max;
public SliderDialog(IReplayBodyProvider rbp) {
super(new Shell(Display.getDefault(), SWT.APPLICATION_MODAL | SWT.SHELL_TRIM), SWT.NONE);
Shell dlgShell = this.getParent();
dlgShell.setSize(250, 125);
dlgShell.addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent e) {
disposeDialog();
}
});
dlgShell.addListener(SWT.Close, new Listener() {
@Override
public void handleEvent(Event event) {
replayBodyProvider.stopReplay();
KinectBodyPresentationManager.showRecordingBody();
}
});
this.replayBodyProvider = rbp;
EMFStorage.getInstance().addObserver(this);
}
protected void disposeDialog() {
// widgets get auto-disposed, remove this as an observer
EMFStorage.getInstance().deleteObserver(this);
}
public void open() {
Shell parent = getParent();
GridLayout layout = new org.eclipse.swt.layout.GridLayout(1, false);
this.getParent().setLayout(layout);
this.getParent().setText("Replay control");
GridData gData = new GridData(SWT.FILL, SWT.FILL, true, false);
slider = new Slider(parent, SWT.HORIZONTAL);
Rectangle clientArea = parent.getClientArea();
slider.setBounds(clientArea.x + 10, clientArea.y + 10, 200, 32);
max = replayBodyProvider.getReplayStatesCount();
slider.setValues(0, 0, max, 1, 1, 1);
slider.setLayoutData(gData);
label = new Label(parent, SWT.BORDER);
gData = new GridData(SWT.FILL, SWT.FILL, true, false);
label.setLayoutData(gData);
if (max == 0) {
label.setText("nothing to replay");
} else {
label.setText(slider.getSelection() + 1 + "/" + max + "steps");
}
Button button = new Button(parent, SWT.NONE);
gData = new GridData(SWT.LEAD, SWT.FILL, false, false);
button.setLayoutData(gData);
button.setText("Play");
slider.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
switch (event.detail) {
case SWT.HOME:
case SWT.DRAG:
case SWT.END:
case SWT.ARROW_DOWN:
case SWT.ARROW_UP:
case SWT.PAGE_DOWN:
case SWT.PAGE_UP:
replayBodyProvider.setReplayToState(slider.getSelection());
label.setText(slider.getSelection() + 1 + "/" + max + "steps");
break;
}
}
});
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
replayBodyProvider.replay(slider.getSelection());
}
});
parent.open();
while (!parent.isDisposed()) {
if (!parent.getDisplay().readAndDispatch()) {
parent.getDisplay().sleep();
}
}
}
@Override
public void update(Observable o, final Object arg) {
Display.getDefault().syncExec(new Runnable() {
public void run() {
slider.setSelection((Integer) arg);
label.setText(slider.getSelection() + 1 + "/" + max + "steps");
}
});
}
}