package org.goko.tools.camera; import java.awt.Dimension; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.IOException; import java.util.concurrent.TimeoutException; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.inject.Inject; import org.eclipse.e4.core.contexts.IEclipseContext; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.wb.swt.ResourceManager; import org.goko.common.GkUiComponent; import org.goko.common.elements.combo.GkCombo; import org.goko.common.elements.combo.LabeledValue; import org.goko.core.common.exception.GkException; import org.goko.core.log.GkLog; import org.goko.tools.camera.part.CameraDisplayPartController; import org.goko.tools.camera.part.CameraDisplayPartModel; import com.github.sarxos.webcam.Webcam; import com.github.sarxos.webcam.WebcamDiscoveryEvent; import com.github.sarxos.webcam.WebcamDiscoveryListener; import com.github.sarxos.webcam.WebcamException; public class CameraDisplayPart extends GkUiComponent<CameraDisplayPartController, CameraDisplayPartModel> implements WebcamDiscoveryListener, PropertyChangeListener { /** LOG */ private static final GkLog LOG = GkLog.getLogger(CameraDisplayPart.class); private WebcamComposite webcamComposite; private GkCombo<LabeledValue<Webcam>> comboDevice; private GkCombo<LabeledValue<Dimension>> comboResolution; @Inject public CameraDisplayPart(IEclipseContext context) { super(context, new CameraDisplayPartController()); } @PostConstruct public void postConstruct(Composite parent) throws IOException, WebcamException, TimeoutException, GkException { parent.setLayout(new GridLayout(1, false)); Composite composite_1 = new Composite(parent, SWT.NONE); composite_1.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); GridLayout gl_composite_1 = new GridLayout(1, false); gl_composite_1.verticalSpacing = 0; gl_composite_1.marginWidth = 0; gl_composite_1.marginHeight = 0; gl_composite_1.horizontalSpacing = 0; composite_1.setLayout(gl_composite_1); Composite ToolbarComposite = new Composite(composite_1, SWT.NONE); ToolbarComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1)); ToolbarComposite.setLayout(new GridLayout(4, false)); comboDevice = new GkCombo(ToolbarComposite, SWT.READ_ONLY); Combo combo = comboDevice.getCombo(); GridData gd_combo = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); gd_combo.widthHint = 130; combo.setLayoutData(gd_combo); comboResolution = new GkCombo<LabeledValue<Dimension>>(ToolbarComposite, SWT.READ_ONLY); Combo comboResolution2 = comboResolution.getCombo(); GridData gd_comboResolution = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); gd_comboResolution.widthHint = 80; comboResolution2.setLayoutData(gd_comboResolution); Button btnStartVideo = new Button(ToolbarComposite, SWT.NONE); btnStartVideo.addMouseListener(new MouseAdapter() { @Override public void mouseUp(MouseEvent e) { getDataModel().setVideoDisplayStarted(true); } }); Button btnStopVideo = new Button(ToolbarComposite, SWT.NONE); btnStopVideo.setImage(ResourceManager.getPluginImage("org.goko.tools.camera", "resources/icons/stop.gif")); btnStopVideo.addMouseListener(new MouseAdapter() { @Override public void mouseUp(MouseEvent e) { getDataModel().setVideoDisplayStarted(false); } }); getController().addEnableBinding(btnStopVideo, CameraDisplayPartModel.VIDEO_DISPLAY_STARTED); btnStartVideo.setImage(ResourceManager.getPluginImage("org.goko.tools.camera", "resources/icons/control.png")); final Composite composite = new Composite(composite_1, SWT.BORDER | SWT.EMBEDDED); composite.setLayout(new FillLayout(SWT.HORIZONTAL)); composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); webcamComposite = new WebcamComposite(composite, SWT.NONE); webcamComposite.setFPS(20.0); webcamComposite.setFillArea(true); getController().addItemsBinding(comboDevice, CameraDisplayPartModel.DEVICE_LIST); getController().addItemSelectionBinding(comboDevice, CameraDisplayPartModel.DEVICE); getController().addEnableReverseBinding(comboDevice, CameraDisplayPartModel.VIDEO_DISPLAY_STARTED); getController().addItemsBinding(comboResolution, CameraDisplayPartModel.RESOLUTION_LIST); getController().addItemSelectionBinding(comboResolution, CameraDisplayPartModel.RESOLUTION); getController().addEnableReverseBinding(comboResolution, CameraDisplayPartModel.VIDEO_DISPLAY_STARTED); getController().addEnableReverseBinding(btnStartVideo, CameraDisplayPartModel.VIDEO_DISPLAY_STARTED); Webcam.addDiscoveryListener(this); getDataModel().addPropertyChangeListener(this); if(getDataModel().getDevice() != null){ webcamComposite.setWebcam(getDataModel().getDevice().getValue()); } } @PreDestroy public void preDestroy(){ if(webcamComposite.isStarted()){ webcamComposite.stop(); } } /** (inheritDoc) * @see com.github.sarxos.webcam.WebcamDiscoveryListener#webcamFound(com.github.sarxos.webcam.WebcamDiscoveryEvent) */ @Override public void webcamFound(WebcamDiscoveryEvent arg0) { getController().updateDeviceCombo(); } /** (inheritDoc) * @see com.github.sarxos.webcam.WebcamDiscoveryListener#webcamGone(com.github.sarxos.webcam.WebcamDiscoveryEvent) */ @Override public void webcamGone(WebcamDiscoveryEvent arg0) { getController().updateDeviceCombo(); } /** (inheritDoc) * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent) */ @Override public void propertyChange(PropertyChangeEvent evt) { if(CameraDisplayPartModel.VIDEO_DISPLAY_STARTED.equals(evt.getPropertyName())){ if(getDataModel().isVideoDisplayStarted()){ Webcam webcam = webcamComposite.getWebcam(); webcam.setCustomViewSizes(new Dimension[] { getDataModel().getResolution().getValue() }); // register custom resolution webcam.setViewSize(getDataModel().getResolution().getValue()); // set it webcamComposite.start(); }else{ webcamComposite.stop(); } }else if(CameraDisplayPartModel.DEVICE.equals(evt.getPropertyName())){ if(webcamComposite.isStarted()){ webcamComposite.stop(); } if(getDataModel().getDevice() != null){ webcamComposite.setWebcam(getDataModel().getDevice().getValue()); if(getDataModel().isVideoDisplayStarted()){ webcamComposite.start(); } } } } }