/*
* 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.mandelbrot;
import java.io.Serializable;
/**
* @author Andrea Medeghini
*/
public class MandelbrotInputManager {
protected static final boolean debug = false;
private ZoomData oldZoomData = new ZoomData();
private ZoomData newZoomData = new ZoomData();
private boolean interrupted = false;
private boolean enabled = false;
// private boolean dirty = false;
private final MandelbrotZoomHandler zoomHandler;
private final MandelbrotInputHandler inputHandler;
/**
*
*/
public MandelbrotInputManager(final MandelbrotZoomHandler zoomHandler) {
inputHandler = new MandelbrotInputHandlerImpl();
this.zoomHandler = zoomHandler;
}
/**
* @return the handler
*/
public MandelbrotInputHandler getInputHandler() {
return inputHandler;
}
/**
* @see java.lang.Object#finalize()
*/
@Override
public void finalize() throws Throwable {
oldZoomData = null;
newZoomData = null;
super.finalize();
}
/**
* @param value
*/
public void setInputHandlerEnabled(final boolean value) {
enabled = value;
}
/**
*
*/
public void startInputHandler() {
interrupted = false;
// dirty = true;
}
/**
*
*/
public void stopInputHandler() {
interrupted = true;
}
/**
*
*/
public void runInputHandler() {
if (interrupted) {
newZoomData.zoomDirection = 0;
newZoomData.shiftDirection = 0;
newZoomData.rotationDirection = 0;
newZoomData.autoZoomEnabled = false;
newZoomData.autoShiftEnabled = false;
newZoomData.autoRotationEnabled = false;
newZoomData.zoomEnabled = false;
newZoomData.shiftEnabled = false;
newZoomData.rotationEnabled = false;
newZoomData.lastMousePosX = 0;
newZoomData.lastMousePosY = 0;
newZoomData.startMousePosX = 0;
newZoomData.startMousePosY = 0;
// dirty = false;
}
else {
newZoomData.zoomDirection = oldZoomData.zoomDirection;
newZoomData.shiftDirection = oldZoomData.shiftDirection;
newZoomData.rotationDirection = oldZoomData.rotationDirection;
newZoomData.autoZoomEnabled = oldZoomData.autoZoomEnabled;
newZoomData.autoShiftEnabled = oldZoomData.autoShiftEnabled;
newZoomData.autoRotationEnabled = oldZoomData.autoRotationEnabled;
newZoomData.zoomEnabled = oldZoomData.zoomEnabled;
newZoomData.shiftEnabled = oldZoomData.shiftEnabled;
newZoomData.rotationEnabled = oldZoomData.rotationEnabled;
newZoomData.lastMousePosX = oldZoomData.lastMousePosX;
newZoomData.lastMousePosY = oldZoomData.lastMousePosY;
newZoomData.startMousePosX = oldZoomData.startMousePosX;
newZoomData.startMousePosY = oldZoomData.startMousePosY;
}
if (enabled && (/* dirty || */newZoomData.zoomEnabled || newZoomData.rotationEnabled || newZoomData.shiftEnabled)) {
final boolean zoom = newZoomData.autoZoomEnabled & newZoomData.zoomEnabled;
final boolean shift = newZoomData.autoShiftEnabled & newZoomData.shiftEnabled;
final boolean rotation = newZoomData.autoRotationEnabled & newZoomData.rotationEnabled;
zoomHandler.doZoom(new MandelbrotZoom(zoom || shift || rotation, newZoomData.zoomEnabled, newZoomData.shiftEnabled, newZoomData.rotationEnabled, newZoomData.zoomDirection, newZoomData.shiftDirection, newZoomData.rotationDirection, newZoomData.lastMousePosX, newZoomData.lastMousePosY, newZoomData.startMousePosX, newZoomData.startMousePosY));
// dirty = false;
}
oldZoomData.startMousePosX = oldZoomData.lastMousePosX;
oldZoomData.startMousePosY = oldZoomData.lastMousePosY;
}
private class MandelbrotInputHandlerImpl implements MandelbrotInputHandler {
/**
* @see net.sf.jame.mandelbrot.MandelbrotInputHandler#setLastMousePosition(double, double)
*/
public void setLastMousePosition(final int x, final int y) {
oldZoomData.lastMousePosX = (x - zoomHandler.getWidth() / 2d) / zoomHandler.getWidth();
oldZoomData.lastMousePosY = (y - zoomHandler.getHeight() / 2d) / zoomHandler.getWidth();
}
/**
* @see net.sf.jame.mandelbrot.MandelbrotInputHandler#setStartMousePosition(double, double)
*/
public void setStartMousePosition(final int x, final int y) {
oldZoomData.startMousePosX = (x - zoomHandler.getWidth() / 2d) / zoomHandler.getWidth();
oldZoomData.startMousePosY = (y - zoomHandler.getHeight() / 2d) / zoomHandler.getWidth();
}
/**
* @see net.sf.jame.mandelbrot.MandelbrotInputHandler#setZoomMode(int)
*/
public void setZoomMode(final int mode) {
switch (mode) {
case MODE_MANUAL: {
break;
}
case MODE_AUTOMATIC: {
break;
}
}
// dirty = true;
}
/**
* @see net.sf.jame.mandelbrot.MandelbrotInputHandler#setShiftMode(int)
*/
public void setShiftMode(final int mode) {
switch (mode) {
case MODE_MANUAL: {
break;
}
case MODE_AUTOMATIC: {
break;
}
}
// dirty = true;
}
/**
* @see net.sf.jame.mandelbrot.MandelbrotInputHandler#setRotationMode(int)
*/
public void setRotationMode(final int mode) {
switch (mode) {
case MODE_MANUAL: {
break;
}
case MODE_AUTOMATIC: {
break;
}
}
// dirty = true;
}
/**
* @see net.sf.jame.mandelbrot.MandelbrotInputHandler#setZoomDirection(int)
*/
public void setZoomDirection(final int direction) {
oldZoomData.autoZoomEnabled = true;
switch (direction) {
case DIRECTION_UNDEFINED: {
oldZoomData.autoZoomEnabled = false;
oldZoomData.zoomDirection = 0;
break;
}
case DIRECTION_FORWARD: {
oldZoomData.zoomDirection = -1;
break;
}
case DIRECTION_BACKWARD: {
oldZoomData.zoomDirection = +1;
break;
}
}
// dirty = true;
}
/**
* @see net.sf.jame.mandelbrot.MandelbrotInputHandler#setShiftDirection(int)
*/
public void setShiftDirection(final int direction) {
oldZoomData.autoShiftEnabled = true;
switch (direction) {
case DIRECTION_UNDEFINED: {
oldZoomData.autoShiftEnabled = false;
oldZoomData.shiftDirection = 0;
break;
}
case DIRECTION_FORWARD: {
oldZoomData.shiftDirection = -1;
break;
}
case DIRECTION_BACKWARD: {
oldZoomData.shiftDirection = +1;
break;
}
}
// dirty = true;
}
/**
* @see net.sf.jame.mandelbrot.MandelbrotInputHandler#setRotationDirection(int)
*/
public void setRotationDirection(final int direction) {
oldZoomData.autoRotationEnabled = true;
switch (direction) {
case DIRECTION_UNDEFINED: {
oldZoomData.autoRotationEnabled = false;
oldZoomData.rotationDirection = 0;
break;
}
case DIRECTION_FORWARD: {
oldZoomData.rotationDirection = -1;
break;
}
case DIRECTION_BACKWARD: {
oldZoomData.rotationDirection = +1;
break;
}
}
// dirty = true;
}
/**
* @see net.sf.jame.mandelbrot.MandelbrotInputHandler#setZoomEnabled(boolean)
*/
public void setZoomEnabled(final boolean value) {
oldZoomData.zoomEnabled = value;
// dirty = true;
}
/**
* @see net.sf.jame.mandelbrot.MandelbrotInputHandler#setShiftEnabled(boolean)
*/
public void setShiftEnabled(final boolean value) {
oldZoomData.shiftEnabled = value;
// dirty = true;
}
/**
* @see net.sf.jame.mandelbrot.MandelbrotInputHandler#setRotationEnabled(boolean)
*/
public void setRotationEnabled(final boolean value) {
oldZoomData.rotationEnabled = value;
// dirty = true;
}
/**
* @see net.sf.jame.mandelbrot.MandelbrotInputHandler#getNormalizedLastMousePositionX()
*/
public double getNormalizedLastMousePositionX() {
return oldZoomData.lastMousePosX;
}
/**
* @see net.sf.jame.mandelbrot.MandelbrotInputHandler#getNormalizedLastMousePositionY()
*/
public double getNormalizedLastMousePositionY() {
return oldZoomData.lastMousePosY;
}
/**
* @see net.sf.jame.mandelbrot.MandelbrotInputHandler#getNormalizedStartMousePositionX()
*/
public double getNormalizedStartMousePositionX() {
return oldZoomData.startMousePosX;
}
/**
* @see net.sf.jame.mandelbrot.MandelbrotInputHandler#getNormalizedStartMousePositionY()
*/
public double getNormalizedStartMousePositionY() {
return oldZoomData.startMousePosY;
}
}
private class ZoomData implements Serializable {
private static final long serialVersionUID = 1L;
boolean autoZoomEnabled = false;
boolean autoShiftEnabled = false;
boolean autoRotationEnabled = false;
boolean zoomEnabled = false;
boolean shiftEnabled = false;
boolean rotationEnabled = false;
int zoomDirection = 0;
int shiftDirection = 0;
int rotationDirection = 0;
double lastMousePosX = 0;
double lastMousePosY = 0;
double startMousePosX = 0;
double startMousePosY = 0;
/**
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
final StringBuffer data = new StringBuffer();
data.append("zoomEnabled=" + zoomEnabled + ",");
data.append("shiftEnabled=" + shiftEnabled + ",");
data.append("rotationEnabled=" + rotationEnabled + ",");
data.append("zoomDynamicEnabled=" + autoZoomEnabled + ",");
data.append("shiftDynamicEnabled=" + autoShiftEnabled + ",");
data.append("rotationDynamicEnabled=" + autoRotationEnabled + ",");
data.append("zoomDirection=" + zoomDirection + ",");
data.append("shiftDirection=" + shiftDirection + ",");
data.append("rotationDirection=" + rotationDirection + ",");
data.append("lastMousePosX=" + lastMousePosX + ",");
data.append("lastMousePosY=" + lastMousePosY + ",");
data.append("startMousePosX=" + startMousePosX + ",");
data.append("startMousePosY=" + startMousePosY);
return data.toString();
}
}
}