/*******************************************************************************
* Copyright (c) 2012 jnect.org.
* 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:
* ${user} - initial API and implementation
*******************************************************************************/
package org.jnect.demo.e4.handlers;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.e4.core.di.annotations.Execute;
import org.eclipse.e4.ui.model.application.ui.basic.MWindow;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Display;
import org.jnect.bodymodel.Body;
import org.jnect.bodymodel.PositionedElement;
import org.jnect.core.KinectManager;
import org.jnect.core.SpeechListener;
public class OpenHandler {
private static final String STOP_RESIZE = "Stop Resize";
private static final String RESIZE = "Enable Resize";
private Body skeletonModel;
public class LeftHandAdapter extends AdapterImpl implements Adapter {
private final MWindow window;
public LeftHandAdapter(MWindow window) {
this.window = window;
}
@Override
public void notifyChanged(Notification msg) {
PositionedElement pe=(PositionedElement)msg.getNotifier();
window.setX(getX(pe));
window.setY(getY(pe));
}
}
public class RightHandAdapter extends AdapterImpl implements Adapter {
private final MWindow window;
public RightHandAdapter(MWindow window) {
this.window = window;
}
@Override
public void notifyChanged(Notification msg) {
window.setWidth(getWidthBetweenHands());
window.setHeight(getHeightBetweenHands());
}
}
private Rectangle displayRect=Display.getDefault().getClientArea();
@Execute
public void execute(final MWindow window){
final KinectManager kinectManager = KinectManager.INSTANCE;
kinectManager.startKinect();
final Adapter leftHandAdapter = new LeftHandAdapter(window);
final Adapter rightHandAdapter = new RightHandAdapter(window);
// kinectManager.startSkeletonTracking();
// skeletonModel=kinectManager.getSkeletonModel();
// kinectManager.getSkeletonModel().getLeftHand().eAdapters().add(leftHandAdapter );
// kinectManager.getSkeletonModel().getRightHand().eAdapters().add(rightHandAdapter );
kinectManager.addSpeechListener(new SpeechListener() {
@Override
public void notifySpeech(String speech) {
if(speech.equals(RESIZE)){
resize();
}
else if(speech.equals(STOP_RESIZE)){
stopresize();
}
}
@Override
public Set<String> getWords() {
Set<String> ret = new HashSet<String>();
ret.add(RESIZE);
ret.add(STOP_RESIZE);
return ret;
}
private void stopresize() {
kinectManager.getSkeletonModel().getLeftHand().eAdapters().remove(leftHandAdapter );
kinectManager.getSkeletonModel().getRightHand().eAdapters().remove(rightHandAdapter );
kinectManager.stopSkeletonTracking();
}
private void resize() {
kinectManager.startSkeletonTracking();
skeletonModel=kinectManager.getSkeletonModel();
kinectManager.getSkeletonModel().getLeftHand().eAdapters().add(leftHandAdapter );
kinectManager.getSkeletonModel().getRightHand().eAdapters().add(rightHandAdapter );
}
});
kinectManager.startSpeechRecognition();
}
public int getY(PositionedElement pe) {
return displayRect.height/2-Math.round(pe.getY()*displayRect.height/2);
}
public int getX(PositionedElement pe) {
return displayRect.width/2+Math.round(pe.getX()*displayRect.width/2);
}
public int getWidthBetweenHands() {
return Math.round((skeletonModel.getRightHand().getX()-skeletonModel.getLeftHand().getX())/2*displayRect.width*1.1f);
}
public int getHeightBetweenHands() {
return Math.round((skeletonModel.getLeftHand().getY()-skeletonModel.getRightHand().getY())/2*displayRect.height*1.1f);
}
}