blob: e8622c0554ebcd549206967653b97ae6ca1c8aab [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2012 IBM Corporation and Others
* 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
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.actf.ai.internal.ui.scripteditor;
import org.eclipse.actf.ai.internal.ui.scripteditor.event.EventManager;
import org.eclipse.actf.ai.internal.ui.scripteditor.event.MouseDragEvent;
import org.eclipse.actf.ai.internal.ui.scripteditor.event.MouseDragEventListener;
import org.eclipse.actf.ai.internal.ui.scripteditor.event.PlayerControlEvent;
import org.eclipse.actf.ai.internal.ui.scripteditor.event.PlayerControlEventListener;
import org.eclipse.actf.ai.internal.ui.scripteditor.event.SyncTimeEvent;
import org.eclipse.actf.ai.internal.ui.scripteditor.event.SyncTimeEventListener;
import org.eclipse.actf.ai.scripteditor.util.SoundMixer;
import org.eclipse.actf.ai.scripteditor.util.TimeFormatUtil;
import org.eclipse.actf.ai.scripteditor.util.WebBrowserFactory;
import org.eclipse.actf.ai.ui.scripteditor.views.IUNIT;
import org.eclipse.actf.ai.ui.scripteditor.views.TimeLineView;
import org.eclipse.actf.examples.scripteditor.Activator;
import org.eclipse.actf.model.ui.IModelService;
import org.eclipse.actf.model.ui.editor.browser.IWebBrowserACTF;
import org.eclipse.actf.model.ui.util.ModelServiceUtils;
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.Image;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Slider;
public class PreviewPanel implements IUNIT, SyncTimeEventListener,
MouseDragEventListener, PlayerControlEventListener {
static private TimeLineView instParentView = null;
static private PreviewPanel ownInst = null;
// action status(0:Idle(Stop/Pause), 1:Play)
private int currentActionStatus = 0;
private boolean isInSampling = false;
private boolean currentStatusMedia = true;
// for timeline drag
private boolean currentDragStatus = false; // status for dragging
private int saveCurrentActionStatus = currentActionStatus; // save
// currentActionStatus
// Preview part
private Button buttonRewind;
private Button buttonPlay;
// Preview Slider (ProgressBar)
private Slider sliderPreview;
private int previousEventSliderPreview = 0;
private int previousMaxSlider = 0;
private boolean stopExpandMaxSlider = false;
private int storeCurrentTimeLineSlider = 0;
// TimeLine control
private Label timelinePreview;
private static EventManager eventManager = null;
/**
* Constructor
*/
private PreviewPanel() {
instParentView = TimeLineView.getInstance();
eventManager = EventManager.getInstance();
}
static public PreviewPanel getInstance() {
if (ownInst == null) {
synchronized (PreviewPanel.class) { // TODO check
// 2nd check current instance
if (ownInst == null) {
ownInst = new PreviewPanel();
}
}
}
return (ownInst);
}
/**
* Initialize own Panel
*/
public void initPreviewPanel(Display parentDisp, Composite parentComposite) {
try {
FormData buttonRewindLData = new FormData();
buttonRewindLData.width = 25;
buttonRewindLData.height = 23;
buttonRewindLData.left = new FormAttachment(0, 1000, 4);
buttonRewindLData.top = new FormAttachment(0, 1000, 2);
buttonRewind = new Button(parentComposite, SWT.PUSH | SWT.CENTER);
buttonRewind.setLayoutData(buttonRewindLData);
// //buttonRewind.setText("Rewind");
Image imgRewind = Activator.getImageDescriptor("/icons/Rewind.jpg")
.createImage();
buttonRewind.setImage(imgRewind);
buttonRewind.setToolTipText("Rewind movie");
// Rewind event listener
buttonRewind.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
rewindMedia();
currentStatusMedia = true;
}
});
buttonRewind.addMouseTrackListener(new MouseCursorTrackAdapter());
FormData buttonPlayLData = new FormData();
buttonPlayLData.width = 24;
buttonPlayLData.height = 23;
buttonPlayLData.left = new FormAttachment(0, 1000, 31);
buttonPlayLData.top = new FormAttachment(0, 1000, 2);
buttonPlay = new Button(parentComposite, SWT.PUSH | SWT.CENTER);
buttonPlay.setLayoutData(buttonPlayLData);
// Initial draw button image by current status
redrawPlayButton(currentActionStatus);
// Play event listener
buttonPlay.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
playPauseMedia();
}
});
buttonPlay.addMouseTrackListener(new MouseCursorTrackAdapter());
FormData labelTimeLinePreviewLData = new FormData();
labelTimeLinePreviewLData.top = new FormAttachment(0, 1000, 8);
labelTimeLinePreviewLData.right = new FormAttachment(1000, 1000, -4);
timelinePreview = new Label(parentComposite, SWT.NONE);
timelinePreview.setLayoutData(labelTimeLinePreviewLData);
timelinePreview.setText("00:00/00:00");
FormData sliderPreviewLayoutData = new FormData();
sliderPreviewLayoutData.height = 14;
sliderPreviewLayoutData.left = new FormAttachment(0, 1000, 60);
sliderPreviewLayoutData.top = new FormAttachment(0, 1000, 6);
sliderPreviewLayoutData.right = new FormAttachment(timelinePreview,
-5);
sliderPreview = new Slider(parentComposite, SWT.HORIZONTAL);
sliderPreview.setLayoutData(sliderPreviewLayoutData);
sliderPreview.setMinimum(0);
sliderPreview.setIncrement(TIME2PIXEL);
setLocationPreviewSlider(TL_DEF_ETIME, 0);
sliderPreview
.addSelectionListener(new SliderPreviewSelectionAdapter());
sliderPreview.addMouseTrackListener(new MouseCursorTrackAdapter());
// initialize event listeners
eventManager.addSyncTimeEventListener(this);
eventManager.addMouseDragEventListener(this);
eventManager.addPlayerControlEvenListener(this);
parentComposite.addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent e) {
// remove EventListener
eventManager.removeSyncTimeEventListener(ownInst);
eventManager.removeMouseDragEventListener(ownInst);
eventManager.removePlayerControlEventListener(ownInst);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Get Play button
*/
public Button getPlayButton() {
return (buttonPlay);
}
private void setLocationPreviewSlider(int movieEndTime, int currentTime) {
// SetUP location of Preview's slider
sliderPreview.setMaximum(movieEndTime);
sliderPreview.setSelection(currentTime);
sliderPreview.setToolTipText(getStringTimeLine(currentTime,
movieEndTime));
}
/**
* @category Setter Method
* @purpose Synchronized Time Line
*/
public void synchronizeTimeLine(int nowTime) {
// PickUP End TimeLine
int movieTotalTime = WebBrowserFactory.getInstance().getTotalLength();
// Update Time Display of own view
timelinePreview.setText(getStringTimeLine(nowTime, movieTotalTime));
// Update slider's position of own view
setLocationPreviewSlider(movieTotalTime, nowTime);
}
private String getStringTimeLine(int nowTime, int endTime) {
String strCurrentTime = new String(TimeFormatUtil.makeFormatMM(nowTime)
+ ":" + TimeFormatUtil.makeFormatSS(nowTime));
String strEndTime = new String(TimeFormatUtil.makeFormatMM(endTime)
+ ":" + TimeFormatUtil.makeFormatSS(endTime));
return (strCurrentTime + "/" + strEndTime);
}
/**
*
* @param nextStatus
*/
private void redrawPlayButton(int nextStatus) {
// SetUP next button image
Image imgPlay = null;
String textToolTip = null;
// Check next status(action)
if (nextStatus == 0) {
// Configure Button
imgPlay = Activator.getImageDescriptor("/icons/Play.jpg")
.createImage();
textToolTip = new String("Play movie");
} else {
// Configure
imgPlay = Activator.getImageDescriptor("/icons/Pause.jpg")
.createImage();
textToolTip = new String("Pause movie");
}
// SetUP new button image
buttonPlay.setImage(imgPlay);
buttonPlay.setToolTipText(textToolTip);
}
/**
* Get current status for media play
*
* @return current status (TRUE:now playing, FALSE:otherwise)
*/
public boolean getCurrentStatusMedia() {
// TODO use WebBrowserFactory
return (currentStatusMedia);
}
/**
* Play/Pause media
*/
public int playPauseMedia() {
// Update status flag
currentActionStatus = ~currentActionStatus;
if (currentActionStatus == 0) {
SoundMixer.getInstance().stopCaptureSound();
SoundMixer.getInstance().stopPlaySound();
// Pause media
WebBrowserFactory.getInstance().pauseMedia();
instParentView.switchActionTimeLine(false);
instParentView.reqStopVoicePlayer();
// redraw captured audio level
instParentView.reqRedrawVolumeLevelCanvas(4);
// Set normal mode
isInSampling = false;
// SetUP enable status for File Menu
currentStatusMedia = true;
} else {
// Check current buffer status
int paintStatus;
if (VolumeLevelCanvas.getInstance().isCaptureEnabled()) {
// Start
SoundMixer.getInstance().startCaptureSound(SM_PMODE_CAPTURE);
// Set sampling mode
isInSampling = true;
// Set paint mode = 2 : Redraw capture data
paintStatus = 2;
} else {
// Set paint mode = 4 : Redraw current off image
paintStatus = 4;
}
instParentView.reqRedrawVolumeLevelCanvas(paintStatus);
// Start media
WebBrowserFactory.getInstance().playMedia();
instParentView.switchActionTimeLine(true);
// SetUP disable status for File Menu
currentStatusMedia = false;
}
redrawPlayButton(currentActionStatus);
// TODO disable preview while playing movie
// EditPanelView panelView = EditPanelView.getInstance();
// if (panelView != null) {
// panelView.getInstanceTabEditPanel().setEnablePreview(
// currentActionStatus);
// panelView.getInstanceTabSelWAVFile().setEnablePreview(
// currentActionStatus);
// }
return (currentActionStatus);
}
public void rewindMedia() {
// Set status "normal mode"
isInSampling = false;
// Rewind VoicePlayer
instParentView.switchActionTimeLine(false);
instParentView.rewindActionTimeLine();
currentActionStatus = 0;
redrawPlayButton(currentActionStatus);
sliderPreview.setSelection(0);
// Close captured voice module
SoundMixer.getInstance().stopCaptureSound();
SoundMixer.getInstance().stopPlaySound();
// Rewind movie
WebBrowserFactory.getInstance().rewindMedia();
// Stop TTS engine
instParentView.reqStopVoicePlayer();
// Rewind all time line
instParentView.reqRewindTimeLine();
// SetUP enable status for File Menu
currentStatusMedia = true;
// Change paint mode : Redraw off image
// ///instParentView.reqRedrawVolumeLevelCanvas(4);
}
/**
* Reload media
*/
public void reload() {
instParentView.cleanupCaptureData();
instParentView.reqRedrawVolumeLevelCanvas(1);
// reload media content
IModelService model = ModelServiceUtils.getActiveModelService();
if (model instanceof IWebBrowserACTF) {
((IWebBrowserACTF) model).navigateRefresh();
}
// Stop TTS engine
instParentView.reqStopVoicePlayer();
// SetUP enable status for File Menu
currentStatusMedia = true;
}
/**
* Local Class extends SliderSelectionAdapter for Slider
*/
class SliderPreviewSelectionAdapter extends SelectionAdapter {
public void widgetSelected(SelectionEvent e) {
// get current location
Slider ps = (Slider) e.getSource();
int currentLocation = ps.getSelection();
// check event of slider
if ((e.detail == SWT.DRAG)
&& (previousEventSliderPreview != SWT.DRAG)) {
// store current event
previousEventSliderPreview = e.detail;
// store current max time line
previousMaxSlider = ps.getMaximum();
pauseForDargging();
eventManager.fireMouseDragEvent(new MouseDragEvent(
MouseDragEvent.MOUSE_SET_DRAG_STATUS,
currentDragStatus, this));
} else if ((e.detail == 0)
&& (previousEventSliderPreview == SWT.DRAG)) {
// store current event
previousEventSliderPreview = e.detail;
resumeAfterDragging();
eventManager.fireMouseDragEvent(new MouseDragEvent(
MouseDragEvent.MOUSE_SET_DRAG_STATUS,
currentDragStatus, this));
// check stop flag & end process
if (stopExpandMaxSlider) {
// reset stop flag
stopExpandMaxSlider = false;
// Update slider's position of own view
setLocationPreviewSlider(ps.getMaximum(),
storeCurrentTimeLineSlider);
}
WebBrowserFactory.getInstance().showCurrentImage();
// drop current event
return;
}
// check single action for expand time line
if (previousEventSliderPreview == SWT.DRAG) {
// check stop max time line
if (currentLocation >= previousMaxSlider) {
// Set stop flag
stopExpandMaxSlider = true;
// store current time line
storeCurrentTimeLineSlider = TimeLineCanvas.getInstance()
.getCurrentPositionMarkerTimeLine();
}
}
// check stop flag
if (!stopExpandMaxSlider) {
// SetUP new location to current TimeLine
instParentView.reqSetTrackCurrentTimeLine(currentLocation);
// // Synchronize all TimeLine
eventManager.fireSyncTimeEvent(new SyncTimeEvent(
currentLocation, this));
WebBrowserFactory.getInstance().setCurrentPosition(
currentLocation);
}
}
}
void pauseForDargging() {
if (currentDragStatus == true) {
return;
}
currentDragStatus = true;
saveCurrentActionStatus = currentActionStatus;
if (saveCurrentActionStatus != 0) { // (0:Idle(Stop/Pause), 1:Play)
playPauseMedia(); // pause media
}
}
void resumeAfterDragging() {
if (currentDragStatus == false) {
return;
}
if (saveCurrentActionStatus != 0) { // (0:Idle(Stop/Pause), 1:Play)
playPauseMedia(); // restart playing media
}
currentDragStatus = false;
}
public void handleSyncTimeEvent(SyncTimeEvent e) {
// Synchronize TimeLine view
if (e.getEventType() == SyncTimeEvent.SYNCHRONIZE_TIME_LINE) {
synchronizeTimeLine(e.getCurrentTime());
}
}
public void handleMouseDragEvent(MouseDragEvent e) {
//
switch (e.getEventType()) {
case MouseDragEvent.MOUSE_DRAG_START:
pauseForDargging();
break;
case MouseDragEvent.MOUSE_SET_DRAG_STATUS:
this.currentDragStatus = e.isStatus();
break;
case MouseDragEvent.MOUSE_DRAG_END:
resumeAfterDragging();
break;
}
}
public void handlePlayPauseEvent(PlayerControlEvent e) {
playPauseMedia();
}
}