/*
* JAME 6.2.1
* http://jame.sourceforge.net
*
* Copyright 2001, 2016 Andrea Medeghini
*
* This file is part of JAME.
*
* JAME is an application for creating fractals and other graphics artifacts.
*
* JAME is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* JAME is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with JAME. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.sf.jame.core.swing.media;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.DisplayMode;
import java.awt.Frame;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.geom.Point2D;
import net.sf.jame.core.media.EngineException;
import net.sf.jame.core.media.Movie;
import net.sf.jame.core.swing.media.renderer.MovieRenderer;
import net.sf.jame.core.swing.media.renderer.RenderingCanvas;
/**
* @author Andrea Medeghini
*/
public final class MovieWindow extends Frame {
private static final long serialVersionUID = 1L;
private GraphicsEnvironment environment;
private GraphicsDevice device;
private MovieRenderer renderer;
private Color color = Color.white;
private boolean debug = false;
private boolean loop = false;
/**
* @param movie
* @param title
*/
public MovieWindow(final Movie movie, final String title) {
try {
environment = GraphicsEnvironment.getLocalGraphicsEnvironment();
if (GraphicsEnvironment.isHeadless()) {
throw new EngineException("Graphics environment is headless!");
}
device = environment.getDefaultScreenDevice();
if (device.getType() != GraphicsDevice.TYPE_RASTER_SCREEN) {
throw new EngineException("Graphics device not found!");
}
loadProperties();
setTitle(title);
setBackground(color);
setForeground(color);
setUndecorated(true);
setCursor(new Cursor(Cursor.HAND_CURSOR));
if (!device.isFullScreenSupported()) {
throw new EngineException("Fullscreen not supported!");
}
device.setFullScreenWindow(this);
if (!device.isDisplayChangeSupported()) {
throw new EngineException("Displaychange not supported!");
}
device.setDisplayMode(new DisplayMode(640, 480, 32, DisplayMode.REFRESH_RATE_UNKNOWN));
DefaultMovieContext movieContext = new DefaultMovieContext();
MovieRenderer renderer = new MovieRenderer(movieContext, movie);
RenderingCanvas canvas = new RenderingCanvas(renderer);
movieContext.setColor(getBackground());
movieContext.setDebug(debug);
movieContext.setLoop(loop);
movieContext.setCanvas(canvas);
setLayout(new BorderLayout());
add(canvas, BorderLayout.CENTER);
pack();
canvas.requestFocus();
addWindowListener(new DefaultWindowAdapter());
addKeyListener(new DefaultKeyAdapter());
renderer = canvas.getRenderer();
movie.setSize(canvas.getSize());
movie.setCenter(new Point2D.Double(-canvas.getSize().getWidth() / 2, -canvas.getSize().getHeight() / 2));
renderer.init();
}
catch (final EngineException e) {
e.printStackTrace();
}
}
private void loadProperties() {
if (System.getProperty("debug", "false").toLowerCase().equals("true")) {
debug = true;
}
if (System.getProperty("loop", "false").toLowerCase().equals("true")) {
loop = true;
}
try {
color = new Color(Integer.parseInt(System.getProperty("color", "#FFFFFF").substring(1), 16));
}
catch (final NumberFormatException e) {
}
}
private class DefaultKeyAdapter extends KeyAdapter {
public DefaultKeyAdapter() {
}
@Override
public void keyPressed(final KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_ESCAPE: {
renderer.dispose();
device.setFullScreenWindow(null);
break;
}
default:
break;
}
}
}
private class DefaultWindowAdapter extends WindowAdapter {
public DefaultWindowAdapter() {
}
@Override
public void windowClosing(final WindowEvent e) {
renderer.dispose();
device.setFullScreenWindow(null);
}
}
}