package @@packageName_parts@@;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.atomic.AtomicReference;
import javafx.event.EventHandler;
import javafx.scene.Node;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.ScrollEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.BorderPane;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaView;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import org.eclipse.e4.core.di.annotations.Optional;
import org.eclipse.e4.ui.di.Focus;
import org.eclipse.e4.ui.di.UIEventTopic;
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
import @@packageName@@.RefreshHandler;
import @@packageName_model@@.Media;
import @@packageName_model@@.MediaType;
@SuppressWarnings("restriction")
public class MediaPart {
public static final String MEDIA_OBJECT_KEY = "MediaObject";
private static final String KEY_TRANSLATE_X = "translateX";
private static final String KEY_TRANSLATE_Y = "translateY";
private static final String KEY_SCALE_FACTOR = "scale";
@Inject
MPart part;
private MediaPlayer mediaPlayer;
private Node focusNode;
@PostConstruct
void init(BorderPane p) {
Media m = Media.deserialize(part.getPersistedState().get(MEDIA_OBJECT_KEY));
if( m.getType() == MediaType.PICTURE ) {
initPicture(p, m);
} else if( m.getType() == MediaType.MOVIE ) {
initMovie(p, m);
} else {
initSound(p, m);
}
}
private void initPicture(BorderPane p, Media m) {
final AnchorPane transformStack = new AnchorPane();
String scaleFactor = part.getPersistedState().get(KEY_SCALE_FACTOR);
String translateX = part.getPersistedState().get(KEY_TRANSLATE_X);
String translateY = part.getPersistedState().get(KEY_TRANSLATE_Y);
if( scaleFactor != null ) {
transformStack.setScaleX(Double.parseDouble(scaleFactor));
transformStack.setScaleY(Double.parseDouble(scaleFactor));
}
if( translateX != null ) {
transformStack.setTranslateX(Double.parseDouble(translateX));
}
if( translateY != null ) {
transformStack.setTranslateY(Double.parseDouble(translateY));
}
final ImageView v = new ImageView(m.getUrl());
focusNode = v;
transformStack.getChildren().add(v);
p.setCenter(transformStack);
p.setOnScroll(new EventHandler<ScrollEvent>() {
@Override
public void handle(ScrollEvent event) {
int direction = event.getDeltaY() < 0 || event.isShiftDown() ? -1 : 1;
double val = Math.max(transformStack.getScaleX() + 0.05 * direction,0.1);
transformStack.setScaleX(val);
transformStack.setScaleY(val);
part.getPersistedState().put(KEY_SCALE_FACTOR, val+"");
}
});
final AtomicReference<MouseEvent> deltaEvent = new AtomicReference<MouseEvent>();
p.setOnMousePressed(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
deltaEvent.set(event);
}
});
p.setOnMouseDragged(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
double deltaX = event.getX() - deltaEvent.get().getX();
double deltaY = event.getY() - deltaEvent.get().getY();
double targetX = transformStack.getTranslateX() + deltaX;
double targetY = transformStack.getTranslateY() + deltaY;
transformStack.setTranslateX(targetX);
transformStack.setTranslateY(targetY);
part.getPersistedState().put(KEY_TRANSLATE_X, targetX+"");
part.getPersistedState().put(KEY_TRANSLATE_Y, targetY+"");
deltaEvent.set(event);
}
});
}
private void initMovie(BorderPane p, Media m) {
mediaPlayer = new MediaPlayer(new javafx.scene.media.Media(platformUriFix(m.getUrl())));
mediaPlayer.setAutoPlay(true);
final MediaView mediaView = new MediaView(mediaPlayer);
focusNode = mediaView;
p.setCenter(mediaView);
p.setOnScroll(new EventHandler<ScrollEvent>() {
@Override
public void handle(ScrollEvent event) {
int direction = event.getDeltaY() < 0 || event.isShiftDown() ? -1 : 1;
double val = Math.max(mediaView.getScaleX() + 0.05 * direction,0.1);
mediaView.setScaleX(val);
mediaView.setScaleY(val);
part.getPersistedState().put(KEY_SCALE_FACTOR, val+"");
}
});
}
@Inject
@Optional
void refresh(@UIEventTopic(RefreshHandler.REFRESH_EVENT) String event) {
if( part.getParent().getSelectedElement() == part ) {
if( mediaPlayer != null ) {
mediaPlayer.seek(mediaPlayer.getStartTime());
}
}
}
@Focus
void focus() {
if( focusNode != null ) {
focusNode.requestFocus();
}
}
private String platformUriFix(String uri) {
if( uri.startsWith("platform:") ) {
try {
URL url = new URL(uri);
InputStream in = url.openStream();
byte[] buf = new byte[1024];
int l;
File f = File.createTempFile("movie", "");
FileOutputStream out = new FileOutputStream(f);
while( (l = in.read(buf)) != -1 ) {
out.write(buf, 0, l);
}
out.close();
return f.toURI().toURL().toExternalForm();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return uri;
} else {
return uri;
}
}
private void initSound(BorderPane p, Media m) {
}
}