/* * 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.swing.extensions.inputAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import net.sf.jame.core.extension.ConfigurableExtensionReference; import net.sf.jame.core.util.DoubleVector2D; import net.sf.jame.core.util.DoubleVector4D; import net.sf.jame.core.util.IntegerVector2D; import net.sf.jame.core.util.IntegerVector4D; import net.sf.jame.core.util.Rectangle; import net.sf.jame.mandelbrot.MandelbrotConfig; import net.sf.jame.mandelbrot.MandelbrotInputHandler; import net.sf.jame.mandelbrot.MandelbrotInputManager; import net.sf.jame.mandelbrot.MandelbrotZoom; import net.sf.jame.mandelbrot.MandelbrotZoomHandler; import net.sf.jame.mandelbrot.extensions.image.MandelbrotImageConfig; import net.sf.jame.mandelbrot.fractal.MandelbrotFractalConfigElement; import net.sf.jame.mandelbrot.renderingFormula.RenderingFormulaConfigElement; import net.sf.jame.mandelbrot.renderingFormula.extension.RenderingFormulaExtensionConfig; import net.sf.jame.twister.common.SpeedElement; import net.sf.jame.twister.common.ViewElement; import net.sf.jame.twister.swing.inputAdapter.DefaultInputAdapterRuntime; import net.sf.jame.twister.util.Speed; import net.sf.jame.twister.util.View; /** * @author Andrea Medeghini */ public class MandelbrotInputAdapterRuntime extends DefaultInputAdapterRuntime { private final MandelbrotInputManager inputManager = new MandelbrotInputManager(new MandelbrotZoomHandlerImpl()); /** * */ public MandelbrotInputAdapterRuntime() { inputManager.setInputHandlerEnabled(true); inputManager.startInputHandler(); } /** * @see net.sf.jame.twister.swing.inputAdapter.DefaultInputAdapterRuntime#refresh() */ @Override public void refresh() { inputManager.runInputHandler(); } /** * @see net.sf.jame.twister.swing.inputAdapter.DefaultInputAdapterRuntime#processKeyPressed(java.awt.event.KeyEvent) */ @Override public void processKeyPressed(final KeyEvent e) { switch (e.getKeyCode()) { case KeyEvent.VK_J: { final MandelbrotImageConfig config = (MandelbrotImageConfig) getAdapterContext().getConfig(); if ((config != null) && (config.getMandelbrotConfig() != null)) { if (config.getMandelbrotConfig().getImageMode() != MandelbrotImageConfig.IMAGE_MODE_JULIA) { config.getContext().updateTimestamp(); config.getMandelbrotConfig().setImageMode(MandelbrotImageConfig.IMAGE_MODE_JULIA); final ViewElement viewElement = getViewElement(); if (viewElement != null) { View view = viewElement.getValue(); getAdapterContext().setAttribute("lastMandelbrotView", view); view = (View) getAdapterContext().getAttribute("lastJuliaView"); if (view == null) { final IntegerVector4D status = new IntegerVector4D(0, 0, 2, 0); final DoubleVector4D position = new DoubleVector4D(0, 0, 1, 0); final DoubleVector4D rotation = new DoubleVector4D(0, 0, 0, 0); view = new View(status, position, rotation); } // getRenderContext().stopRenderers(); viewElement.setValue(view); // getRenderContext().startRenderers(); } } else { final ViewElement viewElement = getViewElement(); if (viewElement != null) { final IntegerVector4D status = new IntegerVector4D(0, 0, 2, 0); final DoubleVector4D position = new DoubleVector4D(0, 0, 1, 0); final DoubleVector4D rotation = new DoubleVector4D(0, 0, 0, 0); final View view = new View(status, position, rotation); // getRenderContext().stopRenderers(); config.getContext().updateTimestamp(); viewElement.setValue(view); // getRenderContext().startRenderers(); } } } break; } case KeyEvent.VK_M: { final MandelbrotImageConfig config = (MandelbrotImageConfig) getAdapterContext().getConfig(); if ((config != null) && (config.getMandelbrotConfig() != null)) { if (config.getMandelbrotConfig().getImageMode() != MandelbrotImageConfig.IMAGE_MODE_MANDELBROT) { config.getContext().updateTimestamp(); config.getMandelbrotConfig().setImageMode(MandelbrotImageConfig.IMAGE_MODE_MANDELBROT); final ViewElement viewElement = getViewElement(); if (viewElement != null) { View view = viewElement.getValue(); getAdapterContext().setAttribute("lastJuliaView", view); view = (View) getAdapterContext().getAttribute("lastMandelbrotView"); if (view == null) { final IntegerVector4D status = new IntegerVector4D(0, 0, 2, 0); final DoubleVector4D position = new DoubleVector4D(0, 0, 1, 0); final DoubleVector4D rotation = new DoubleVector4D(0, 0, 0, 0); view = new View(status, position, rotation); } // getRenderContext().stopRenderers(); viewElement.setValue(view); // getRenderContext().startRenderers(); } } else { final ViewElement viewElement = getViewElement(); if (viewElement != null) { final IntegerVector4D status = new IntegerVector4D(0, 0, 2, 0); final DoubleVector4D position = new DoubleVector4D(0, 0, 1, 0); final DoubleVector4D rotation = new DoubleVector4D(0, 0, 0, 0); final View view = new View(status, position, rotation); // getRenderContext().stopRenderers(); config.getContext().updateTimestamp(); viewElement.setValue(view); // getRenderContext().startRenderers(); } } } break; } case KeyEvent.VK_Z: { final MandelbrotImageConfig config = (MandelbrotImageConfig) getAdapterContext().getConfig(); if (config.getMandelbrotConfig() != null) { if (config.getMandelbrotConfig().getInputMode() != MandelbrotImageConfig.INPUT_MODE_ZOOM) { final MandelbrotInputHandler mandelbrotHandler = inputManager.getInputHandler(); mandelbrotHandler.setZoomDirection(MandelbrotInputHandler.DIRECTION_UNDEFINED); mandelbrotHandler.setShiftDirection(MandelbrotInputHandler.DIRECTION_UNDEFINED); mandelbrotHandler.setRotationDirection(MandelbrotInputHandler.DIRECTION_UNDEFINED); mandelbrotHandler.setZoomEnabled(false); mandelbrotHandler.setShiftEnabled(false); mandelbrotHandler.setRotationEnabled(false); config.getContext().updateTimestamp(); config.getMandelbrotConfig().getInputModeElement().setValue(new Integer(MandelbrotImageConfig.INPUT_MODE_ZOOM)); } } break; } case KeyEvent.VK_S: { final MandelbrotImageConfig config = (MandelbrotImageConfig) getAdapterContext().getConfig(); if (config.getMandelbrotConfig() != null) { if (config.getMandelbrotConfig().getInputMode() != MandelbrotImageConfig.INPUT_MODE_SELECT) { final MandelbrotInputHandler mandelbrotHandler = inputManager.getInputHandler(); mandelbrotHandler.setZoomDirection(MandelbrotInputHandler.DIRECTION_UNDEFINED); mandelbrotHandler.setShiftDirection(MandelbrotInputHandler.DIRECTION_UNDEFINED); mandelbrotHandler.setRotationDirection(MandelbrotInputHandler.DIRECTION_UNDEFINED); mandelbrotHandler.setZoomEnabled(false); mandelbrotHandler.setShiftEnabled(false); mandelbrotHandler.setRotationEnabled(false); config.getContext().updateTimestamp(); config.getMandelbrotConfig().getInputModeElement().setValue(new Integer(MandelbrotImageConfig.INPUT_MODE_SELECT)); } } break; } case KeyEvent.VK_R: { final MandelbrotImageConfig config = (MandelbrotImageConfig) getAdapterContext().getConfig(); if (config.getMandelbrotConfig() != null) { config.getContext().updateTimestamp(); config.getMandelbrotConfig().setPreviewArea(config.getMandelbrotConfig().getPreviewAreaElement().getDefaultValue()); } break; } case KeyEvent.VK_P: { final MandelbrotImageConfig config = (MandelbrotImageConfig) getAdapterContext().getConfig(); if (config.getMandelbrotConfig() != null) { config.getContext().updateTimestamp(); config.getMandelbrotConfig().setShowPreview(!config.getMandelbrotConfig().getShowPreview()); } break; } case KeyEvent.VK_T: { final MandelbrotImageConfig config = (MandelbrotImageConfig) getAdapterContext().getConfig(); if (config.getMandelbrotConfig() != null) { config.getContext().updateTimestamp(); config.getMandelbrotConfig().setShowOrbitTrap(!config.getMandelbrotConfig().getShowOrbitTrap()); } break; } case KeyEvent.VK_O: { final MandelbrotImageConfig config = (MandelbrotImageConfig) getAdapterContext().getConfig(); if (config.getMandelbrotConfig() != null) { config.getContext().updateTimestamp(); config.getMandelbrotConfig().setShowOrbit(!config.getMandelbrotConfig().getShowOrbit()); } break; } case KeyEvent.VK_LEFT: { final MandelbrotImageConfig config = (MandelbrotImageConfig) getAdapterContext().getConfig(); if ((config != null) && (config.getMandelbrotConfig() != null)) { final MandelbrotInputHandler mandelbrotHandler = inputManager.getInputHandler(); mandelbrotHandler.setRotationDirection(MandelbrotInputHandler.DIRECTION_FORWARD); mandelbrotHandler.setRotationEnabled(true); } break; } case KeyEvent.VK_RIGHT: { final MandelbrotImageConfig config = (MandelbrotImageConfig) getAdapterContext().getConfig(); if ((config != null) && (config.getMandelbrotConfig() != null)) { final MandelbrotInputHandler mandelbrotHandler = inputManager.getInputHandler(); mandelbrotHandler.setRotationDirection(MandelbrotInputHandler.DIRECTION_BACKWARD); mandelbrotHandler.setRotationEnabled(true); } break; } case KeyEvent.VK_UP: { final MandelbrotImageConfig config = (MandelbrotImageConfig) getAdapterContext().getConfig(); if ((config != null) && (config.getMandelbrotConfig() != null)) { final MandelbrotInputHandler mandelbrotHandler = inputManager.getInputHandler(); mandelbrotHandler.setZoomDirection(MandelbrotInputHandler.DIRECTION_FORWARD); mandelbrotHandler.setZoomEnabled(true); } break; } case KeyEvent.VK_DOWN: { final MandelbrotImageConfig config = (MandelbrotImageConfig) getAdapterContext().getConfig(); if ((config != null) && (config.getMandelbrotConfig() != null)) { final MandelbrotInputHandler mandelbrotHandler = inputManager.getInputHandler(); mandelbrotHandler.setZoomDirection(MandelbrotInputHandler.DIRECTION_BACKWARD); mandelbrotHandler.setZoomEnabled(true); } break; } case KeyEvent.VK_PAGE_UP: { final MandelbrotImageConfig config = (MandelbrotImageConfig) getAdapterContext().getConfig(); if ((config != null) && (config.getMandelbrotConfig() != null)) { final MandelbrotInputHandler mandelbrotHandler = inputManager.getInputHandler(); mandelbrotHandler.setShiftDirection(MandelbrotInputHandler.DIRECTION_FORWARD); mandelbrotHandler.setShiftEnabled(true); } break; } case KeyEvent.VK_PAGE_DOWN: { final MandelbrotImageConfig config = (MandelbrotImageConfig) getAdapterContext().getConfig(); if ((config != null) && (config.getMandelbrotConfig() != null)) { final MandelbrotInputHandler mandelbrotHandler = inputManager.getInputHandler(); mandelbrotHandler.setShiftDirection(MandelbrotInputHandler.DIRECTION_BACKWARD); mandelbrotHandler.setShiftEnabled(true); } break; } default: { break; } } } /** * @see net.sf.jame.twister.swing.inputAdapter.DefaultInputAdapterRuntime#processKeyReleased(java.awt.event.KeyEvent) */ @Override public void processKeyReleased(final KeyEvent e) { switch (e.getKeyCode()) { case KeyEvent.VK_LEFT: { final MandelbrotImageConfig config = (MandelbrotImageConfig) getAdapterContext().getConfig(); if ((config != null) && (config.getMandelbrotConfig() != null)) { final MandelbrotInputHandler mandelbrotHandler = inputManager.getInputHandler(); mandelbrotHandler.setRotationEnabled(false); mandelbrotHandler.setRotationDirection(MandelbrotInputHandler.DIRECTION_UNDEFINED); } break; } case KeyEvent.VK_RIGHT: { final MandelbrotImageConfig config = (MandelbrotImageConfig) getAdapterContext().getConfig(); if ((config != null) && (config.getMandelbrotConfig() != null)) { final MandelbrotInputHandler mandelbrotHandler = inputManager.getInputHandler(); mandelbrotHandler.setRotationEnabled(false); mandelbrotHandler.setRotationDirection(MandelbrotInputHandler.DIRECTION_UNDEFINED); } break; } case KeyEvent.VK_UP: { final MandelbrotImageConfig config = (MandelbrotImageConfig) getAdapterContext().getConfig(); if ((config != null) && (config.getMandelbrotConfig() != null)) { final MandelbrotInputHandler mandelbrotHandler = inputManager.getInputHandler(); mandelbrotHandler.setZoomEnabled(false); mandelbrotHandler.setZoomDirection(MandelbrotInputHandler.DIRECTION_UNDEFINED); } break; } case KeyEvent.VK_DOWN: { final MandelbrotImageConfig config = (MandelbrotImageConfig) getAdapterContext().getConfig(); if ((config != null) && (config.getMandelbrotConfig() != null)) { final MandelbrotInputHandler mandelbrotHandler = inputManager.getInputHandler(); mandelbrotHandler.setZoomEnabled(false); mandelbrotHandler.setZoomDirection(MandelbrotInputHandler.DIRECTION_UNDEFINED); } break; } case KeyEvent.VK_PAGE_UP: { final MandelbrotImageConfig config = (MandelbrotImageConfig) getAdapterContext().getConfig(); if ((config != null) && (config.getMandelbrotConfig() != null)) { final MandelbrotInputHandler mandelbrotHandler = inputManager.getInputHandler(); mandelbrotHandler.setShiftEnabled(false); mandelbrotHandler.setShiftDirection(MandelbrotInputHandler.DIRECTION_UNDEFINED); } break; } case KeyEvent.VK_PAGE_DOWN: { final MandelbrotImageConfig config = (MandelbrotImageConfig) getAdapterContext().getConfig(); if ((config != null) && (config.getMandelbrotConfig() != null)) { final MandelbrotInputHandler mandelbrotHandler = inputManager.getInputHandler(); mandelbrotHandler.setShiftEnabled(false); mandelbrotHandler.setShiftDirection(MandelbrotInputHandler.DIRECTION_UNDEFINED); } break; } default: { break; } } } /** * @see net.sf.jame.twister.swing.inputAdapter.DefaultInputAdapterRuntime#processKeyTyped(java.awt.event.KeyEvent) */ @Override public void processKeyTyped(final KeyEvent e) { } /** * @see net.sf.jame.twister.swing.inputAdapter.DefaultInputAdapterRuntime#processMouseClicked(java.awt.event.MouseEvent) */ @Override public void processMouseClicked(final MouseEvent e) { final MandelbrotImageConfig config = (MandelbrotImageConfig) getAdapterContext().getConfig(); if (config.getMandelbrotConfig() != null) { if (config.getMandelbrotConfig().getShowPreview()) { final Rectangle previewArea = config.getMandelbrotConfig().getPreviewArea(); final double x = (double) e.getX() / (double) getSizeX(); final double y = (double) e.getY() / (double) getSizeY(); if ((x > previewArea.getX()) && (x < previewArea.getX() + previewArea.getW())) { if ((y > previewArea.getY()) && (y < previewArea.getY() + previewArea.getH())) { if (config.getMandelbrotConfig().getImageMode() == MandelbrotImageConfig.IMAGE_MODE_JULIA) { config.getContext().updateTimestamp(); config.getMandelbrotConfig().setImageMode(MandelbrotImageConfig.IMAGE_MODE_MANDELBROT); final ViewElement viewElement = getViewElement(); if (viewElement != null) { View view = viewElement.getValue(); getAdapterContext().setAttribute("lastJuliaView", view); view = (View) getAdapterContext().getAttribute("lastMandelbrotView"); if (view == null) { final IntegerVector4D status = new IntegerVector4D(0, 0, 0, 0); final DoubleVector4D position = new DoubleVector4D(0, 0, 1, 0); final DoubleVector4D rotation = new DoubleVector4D(0, 0, 0, 0); view = new View(status, position, rotation); } // getRenderContext().stopRenderers(); viewElement.setValue(view); // getRenderContext().startRenderers(); } return; } if (config.getMandelbrotConfig().getImageMode() == MandelbrotImageConfig.IMAGE_MODE_MANDELBROT) { config.getContext().updateTimestamp(); config.getMandelbrotConfig().setImageMode(MandelbrotImageConfig.IMAGE_MODE_JULIA); final ViewElement viewElement = getViewElement(); if (viewElement != null) { View view = viewElement.getValue(); getAdapterContext().setAttribute("lastMandelbrotView", view); view = (View) getAdapterContext().getAttribute("lastJuliaView"); if (view == null) { final IntegerVector4D status = new IntegerVector4D(0, 0, 0, 0); final DoubleVector4D position = new DoubleVector4D(0, 0, 1, 0); final DoubleVector4D rotation = new DoubleVector4D(0, 0, 0, 0); view = new View(status, position, rotation); } // getRenderContext().stopRenderers(); viewElement.setValue(view); // getRenderContext().startRenderers(); } return; } } } } if ((config.getMandelbrotConfig().getInputMode() == MandelbrotImageConfig.INPUT_MODE_SELECT) && !e.isControlDown()) { final MandelbrotInputHandler mandelbrotHandler = inputManager.getInputHandler(); mandelbrotHandler.setLastMousePosition(e.getX(), e.getY()); final ViewElement viewElement = getViewElement(); if ((config.getMandelbrotConfig() != null) && (viewElement != null)) { View view = viewElement.getValue(); double x = view.getPosition().getX(); double y = view.getPosition().getY(); final double z = view.getPosition().getZ(); final double a = view.getRotation().getZ(); final RenderingFormulaExtensionConfig formulaConfig = getRenderingFormulaExtensionConfig(); if ((formulaConfig != null) && config.getMandelbrotConfig().isMandelbrotMode()) { final DoubleVector2D center = formulaConfig.getCenter(); final DoubleVector2D scale = formulaConfig.getScale(); x = x + center.getX() + (z * scale.getX()) * ((Math.cos(a) * mandelbrotHandler.getNormalizedLastMousePositionX()) + (Math.sin(a) * mandelbrotHandler.getNormalizedLastMousePositionY())); y = y + center.getY() + (z * scale.getY()) * ((Math.cos(a) * mandelbrotHandler.getNormalizedLastMousePositionY()) - (Math.sin(a) * mandelbrotHandler.getNormalizedLastMousePositionX())); getAdapterContext().setAttribute("lastMandelbrotView", view); final IntegerVector4D status = new IntegerVector4D(0, 0, 0, 0); final DoubleVector4D position = new DoubleVector4D(0, 0, 1, 0); final DoubleVector4D rotation = new DoubleVector4D(0, 0, 0, 0); view = new View(status, position, rotation); // getRenderContext().stopRenderers(); config.getContext().updateTimestamp(); config.getMandelbrotConfig().setConstant(new DoubleVector2D(x, y)); config.getMandelbrotConfig().setImageMode(1); getAdapterContext().setAttribute("lastJuliaView", view); viewElement.setValue(view); config.getMandelbrotConfig().setInputMode(new Integer(0)); // getRenderContext().startRenderers(); } } } if ((config.getMandelbrotConfig().getInputMode() == MandelbrotImageConfig.INPUT_MODE_SELECT) && e.isShiftDown()) { final MandelbrotInputHandler mandelbrotHandler = inputManager.getInputHandler(); mandelbrotHandler.setLastMousePosition(e.getX(), e.getY()); final ViewElement viewElement = getViewElement(); if ((config.getMandelbrotConfig() != null) && (viewElement != null)) { View view = viewElement.getValue(); double x = view.getPosition().getX(); double y = view.getPosition().getY(); final double z = view.getPosition().getZ(); final double a = view.getRotation().getZ(); final RenderingFormulaExtensionConfig formulaConfig = getRenderingFormulaExtensionConfig(); if (formulaConfig != null) { final DoubleVector2D center = formulaConfig.getCenter(); final DoubleVector2D scale = formulaConfig.getScale(); x = x + center.getX() + (z * scale.getX()) * ((Math.cos(a) * mandelbrotHandler.getNormalizedLastMousePositionX()) + (Math.sin(a) * mandelbrotHandler.getNormalizedLastMousePositionY())); y = y + center.getY() + (z * scale.getY()) * ((Math.cos(a) * mandelbrotHandler.getNormalizedLastMousePositionY()) - (Math.sin(a) * mandelbrotHandler.getNormalizedLastMousePositionX())); // getRenderContext().stopRenderers(); config.getContext().updateTimestamp(); config.getMandelbrotConfig().getMandelbrotFractal().getOrbitTrapConfigElement().setCenter(new DoubleVector2D(x, -y)); // getRenderContext().refresh(); // getRenderContext().startRenderers(); } } } } } /** * @see net.sf.jame.twister.swing.inputAdapter.DefaultInputAdapterRuntime#processMouseDragged(java.awt.event.MouseEvent) */ @Override public void processMouseDragged(final MouseEvent e) { final MandelbrotImageConfig config = (MandelbrotImageConfig) getAdapterContext().getConfig(); if (config.getMandelbrotConfig() != null) { final IntegerVector2D startMousePosition = (IntegerVector2D) getAdapterContext().getAttribute("startMousePosition"); final Rectangle oldArea = (Rectangle) getAdapterContext().getAttribute("oldArea"); if ((startMousePosition != null) && (oldArea != null)) { final double dx = (e.getX() - startMousePosition.getX()) / (double) getSizeX(); final double dy = (e.getY() - startMousePosition.getY()) / (double) getSizeY(); final Rectangle newArea = new Rectangle(oldArea.getX() + dx, oldArea.getY() + dy, oldArea.getW(), oldArea.getH()); config.getContext().updateTimestamp(); config.getMandelbrotConfig().setPreviewArea(newArea); return; } if (config.getMandelbrotConfig().getInputMode() == MandelbrotImageConfig.INPUT_MODE_ZOOM) { final MandelbrotInputHandler mandelbrotHandler = inputManager.getInputHandler(); mandelbrotHandler.setLastMousePosition(e.getX(), e.getY()); } if ((config.getMandelbrotConfig().getInputMode() == MandelbrotImageConfig.INPUT_MODE_SELECT) && e.isShiftDown()) { final MandelbrotInputHandler mandelbrotHandler = inputManager.getInputHandler(); mandelbrotHandler.setLastMousePosition(e.getX(), e.getY()); final ViewElement viewElement = getViewElement(); if ((config.getMandelbrotConfig() != null) && (viewElement != null)) { View view = viewElement.getValue(); double x = view.getPosition().getX(); double y = view.getPosition().getY(); final double z = view.getPosition().getZ(); final double a = view.getRotation().getZ(); final RenderingFormulaExtensionConfig formulaConfig = getRenderingFormulaExtensionConfig(); if (formulaConfig != null) { final DoubleVector2D center = formulaConfig.getCenter(); final DoubleVector2D scale = formulaConfig.getScale(); x = x + center.getX() + (z * scale.getX()) * ((Math.cos(a) * mandelbrotHandler.getNormalizedLastMousePositionX()) + (Math.sin(a) * mandelbrotHandler.getNormalizedLastMousePositionY())); y = y + center.getY() + (z * scale.getY()) * ((Math.cos(a) * mandelbrotHandler.getNormalizedLastMousePositionY()) - (Math.sin(a) * mandelbrotHandler.getNormalizedLastMousePositionX())); // getRenderContext().stopRenderers(); config.getContext().updateTimestamp(); config.getMandelbrotConfig().getMandelbrotFractal().getOrbitTrapConfigElement().setCenter(new DoubleVector2D(x, -y)); // getRenderContext().refresh(); // getRenderContext().startRenderers(); } } } } } /** * @see net.sf.jame.twister.swing.inputAdapter.DefaultInputAdapterRuntime#processMouseEntered(java.awt.event.MouseEvent) */ @Override public void processMouseEntered(final MouseEvent e) { } /** * @see net.sf.jame.twister.swing.inputAdapter.DefaultInputAdapterRuntime#processMouseExited(java.awt.event.MouseEvent) */ @Override public void processMouseExited(final MouseEvent e) { } /** * @see net.sf.jame.twister.swing.inputAdapter.DefaultInputAdapterRuntime#processMouseMoved(java.awt.event.MouseEvent) */ @Override public void processMouseMoved(final MouseEvent e) { final MandelbrotImageConfig config = (MandelbrotImageConfig) getAdapterContext().getConfig(); if (config.getMandelbrotConfig() != null) { if (config.getMandelbrotConfig().getInputMode() == MandelbrotImageConfig.INPUT_MODE_ZOOM) { final MandelbrotInputHandler mandelbrotHandler = inputManager.getInputHandler(); mandelbrotHandler.setLastMousePosition(e.getX(), e.getY()); } else { final MandelbrotInputHandler mandelbrotHandler = inputManager.getInputHandler(); mandelbrotHandler.setLastMousePosition(e.getX(), e.getY()); final ViewElement viewElement = getViewElement(); if (viewElement != null) { final View view = viewElement.getValue(); double x = view.getPosition().getX(); double y = view.getPosition().getY(); final double z = view.getPosition().getZ(); final double a = view.getRotation().getZ(); final RenderingFormulaExtensionConfig formulaConfig = getRenderingFormulaExtensionConfig(); if ((formulaConfig != null) && config.getMandelbrotConfig().isMandelbrotMode()) { final DoubleVector2D center = formulaConfig.getCenter(); final DoubleVector2D scale = formulaConfig.getScale(); x = x + center.getX() + (z * scale.getX()) * ((Math.cos(a) * mandelbrotHandler.getNormalizedLastMousePositionX()) + (Math.sin(a) * mandelbrotHandler.getNormalizedLastMousePositionY())); y = y + center.getY() + (z * scale.getY()) * ((Math.cos(a) * mandelbrotHandler.getNormalizedLastMousePositionY()) - (Math.sin(a) * mandelbrotHandler.getNormalizedLastMousePositionX())); config.getContext().updateTimestamp(); config.getMandelbrotConfig().setConstant(new DoubleVector2D(x, y)); } } } } } /** * @see net.sf.jame.twister.swing.inputAdapter.DefaultInputAdapterRuntime#processMousePressed(java.awt.event.MouseEvent) */ @Override public void processMousePressed(final MouseEvent e) { final MandelbrotImageConfig config = (MandelbrotImageConfig) getAdapterContext().getConfig(); if (config.getMandelbrotConfig() != null) { if (config.getMandelbrotConfig().getShowPreview()) { final Rectangle previewArea = config.getMandelbrotConfig().getPreviewArea(); final double x = (double) e.getX() / (double) getSizeX(); final double y = (double) e.getY() / (double) getSizeY(); if ((x > previewArea.getX()) && (x < previewArea.getX() + previewArea.getW())) { if ((y > previewArea.getY()) && (y < previewArea.getY() + previewArea.getH())) { getAdapterContext().setAttribute("startMousePosition", new IntegerVector2D(e.getX(), e.getY())); getAdapterContext().setAttribute("oldArea", previewArea); return; } } } if (config.getMandelbrotConfig().getInputMode() == MandelbrotImageConfig.INPUT_MODE_ZOOM) { final MandelbrotInputHandler mandelbrotHandler = inputManager.getInputHandler(); mandelbrotHandler.setLastMousePosition(e.getX(), e.getY()); mandelbrotHandler.setStartMousePosition(e.getX(), e.getY()); if (e.isControlDown()) { mandelbrotHandler.setRotationEnabled(false); mandelbrotHandler.setShiftEnabled(false); mandelbrotHandler.setZoomEnabled(false); switch (e.getButton()) { case (MouseEvent.BUTTON1): { mandelbrotHandler.setShiftDirection(MandelbrotInputHandler.DIRECTION_FORWARD); break; } case (MouseEvent.BUTTON2): { mandelbrotHandler.setShiftDirection(MandelbrotInputHandler.DIRECTION_UNDEFINED); break; } case (MouseEvent.BUTTON3): { mandelbrotHandler.setShiftDirection(MandelbrotInputHandler.DIRECTION_BACKWARD); break; } } mandelbrotHandler.setShiftEnabled(true); } else if (e.isShiftDown()) { mandelbrotHandler.setRotationEnabled(false); mandelbrotHandler.setShiftEnabled(false); mandelbrotHandler.setZoomEnabled(false); switch (e.getButton()) { case (MouseEvent.BUTTON1): { mandelbrotHandler.setRotationDirection(MandelbrotInputHandler.DIRECTION_FORWARD); break; } case (MouseEvent.BUTTON2): { mandelbrotHandler.setRotationDirection(MandelbrotInputHandler.DIRECTION_UNDEFINED); break; } case (MouseEvent.BUTTON3): { mandelbrotHandler.setRotationDirection(MandelbrotInputHandler.DIRECTION_BACKWARD); break; } } mandelbrotHandler.setRotationEnabled(true); } else { mandelbrotHandler.setRotationEnabled(false); mandelbrotHandler.setShiftEnabled(false); mandelbrotHandler.setZoomEnabled(false); switch (e.getButton()) { case (MouseEvent.BUTTON1): { mandelbrotHandler.setZoomDirection(MandelbrotInputHandler.DIRECTION_FORWARD); break; } case (MouseEvent.BUTTON2): { mandelbrotHandler.setZoomDirection(MandelbrotInputHandler.DIRECTION_UNDEFINED); break; } case (MouseEvent.BUTTON3): { mandelbrotHandler.setZoomDirection(MandelbrotInputHandler.DIRECTION_BACKWARD); break; } } mandelbrotHandler.setZoomEnabled(true); } } } } /** * @see net.sf.jame.twister.swing.inputAdapter.DefaultInputAdapterRuntime#processMouseReleased(java.awt.event.MouseEvent) */ @Override public void processMouseReleased(final MouseEvent e) { final MandelbrotImageConfig config = (MandelbrotImageConfig) getAdapterContext().getConfig(); if (config.getMandelbrotConfig() != null) { final IntegerVector2D startMousePosition = (IntegerVector2D) getAdapterContext().getAttribute("startMousePosition"); final Rectangle oldArea = (Rectangle) getAdapterContext().getAttribute("oldArea"); if ((startMousePosition != null) && (oldArea != null)) { final double dx = (e.getX() - startMousePosition.getX()) / (double) getSizeX(); final double dy = (e.getY() - startMousePosition.getY()) / (double) getSizeY(); final Rectangle newArea = new Rectangle(oldArea.getX() + dx, oldArea.getY() + dy, oldArea.getW(), oldArea.getH()); config.getContext().updateTimestamp(); config.getMandelbrotConfig().setPreviewArea(newArea); getAdapterContext().removeAttribute("startMousePosition"); getAdapterContext().removeAttribute("oldArea"); return; } if (config.getMandelbrotConfig().getInputMode() == MandelbrotImageConfig.INPUT_MODE_ZOOM) { final MandelbrotInputHandler mandelbrotHandler = inputManager.getInputHandler(); mandelbrotHandler.setLastMousePosition(e.getX(), e.getY()); mandelbrotHandler.setStartMousePosition(e.getX(), e.getY()); mandelbrotHandler.setZoomDirection(MandelbrotInputHandler.DIRECTION_UNDEFINED); mandelbrotHandler.setShiftDirection(MandelbrotInputHandler.DIRECTION_UNDEFINED); mandelbrotHandler.setRotationDirection(MandelbrotInputHandler.DIRECTION_UNDEFINED); mandelbrotHandler.setZoomEnabled(false); mandelbrotHandler.setShiftEnabled(false); mandelbrotHandler.setRotationEnabled(false); } } } private RenderingFormulaExtensionConfig getRenderingFormulaExtensionConfig() { final MandelbrotImageConfig imageConfig = (MandelbrotImageConfig) getAdapterContext().getConfig(); if (imageConfig != null) { final MandelbrotConfig mandelbrotConfig = imageConfig.getMandelbrotConfig(); if (mandelbrotConfig != null) { final MandelbrotFractalConfigElement fractalElement = mandelbrotConfig.getMandelbrotFractal(); if (fractalElement != null) { final RenderingFormulaConfigElement formulaElement = fractalElement.getRenderingFormulaConfigElement(); if (formulaElement != null) { final ConfigurableExtensionReference<RenderingFormulaExtensionConfig> reference = formulaElement.getReference(); if (reference != null) { return reference.getExtensionConfig(); } } } } } return null; } private ViewElement getViewElement() { final MandelbrotImageConfig imageConfig = (MandelbrotImageConfig) getAdapterContext().getConfig(); if (imageConfig != null) { final MandelbrotConfig mandelbrotConfig = imageConfig.getMandelbrotConfig(); if (mandelbrotConfig != null) { return mandelbrotConfig.getViewElement(); } } return null; } private SpeedElement getSpeedElement() { final MandelbrotImageConfig imageConfig = (MandelbrotImageConfig) getAdapterContext().getConfig(); if (imageConfig != null) { final MandelbrotConfig mandelbrotConfig = imageConfig.getMandelbrotConfig(); if (mandelbrotConfig != null) { return mandelbrotConfig.getSpeedElement(); } } return null; } private int getSizeX() { return getRenderContext().getImageSize().getX(); } private int getSizeY() { return getRenderContext().getImageSize().getY(); } private class MandelbrotZoomHandlerImpl implements MandelbrotZoomHandler { /** * @see net.sf.jame.mandelbrot.MandelbrotZoomHandler#doZoom(net.sf.jame.mandelbrot.MandelbrotZoom) */ public void doZoom(final MandelbrotZoom zoom) { double zoomSpeed = 1.0; double shiftSpeed = 1.0; double rotationSpeed = Math.PI / 180.0; final ViewElement viewElement = getViewElement(); final SpeedElement speedElement = getSpeedElement(); Speed speed = speedElement.getValue(); zoomSpeed = zoomSpeed + Math.abs((speed.getPosition().getZ() / 1000)); shiftSpeed = Math.abs(speed.getPosition().getW()); rotationSpeed = Math.abs((((Math.PI / 180.0) * speed.getRotation().getZ()) / 100)); if (viewElement != null) { View view = viewElement.getValue(); double x = view.getPosition().getX(); double y = view.getPosition().getY(); double z = view.getPosition().getZ(); double a = view.getRotation().getZ(); double s = view.getRotation().getW(); if (zoom.rotationEnabled) { if (zoom.rotationDirection != 0) { a = a + ((zoom.rotationDirection > 0) ? (+rotationSpeed) : (-rotationSpeed)); } } if (zoom.shiftEnabled) { if (zoom.shiftDirection != 0) { s = s + ((zoom.shiftDirection > 0) ? (+shiftSpeed) : (-shiftSpeed)); } } if (s < 0) { s = 0; } if (zoom.zoomEnabled) { if (zoom.zoomDirection != 0) { final double zs = (zoom.zoomDirection > 0) ? zoomSpeed : (1.0 / zoomSpeed); final RenderingFormulaExtensionConfig formulaConfig = getRenderingFormulaExtensionConfig(); if (formulaConfig != null) { final DoubleVector2D scale = formulaConfig.getScale(); x = x - (zs - 1) * (z * scale.getX()) * ((Math.cos(a) * zoom.lastX) + (Math.sin(a) * zoom.lastY)); y = y - (zs - 1) * (z * scale.getY()) * ((Math.cos(a) * zoom.lastY) - (Math.sin(a) * zoom.lastX)); z = z * zs; final IntegerVector4D status = new IntegerVector4D(0, 0, zoom.zoomEnabled || zoom.rotationEnabled ? 1 : 0, zoom.shiftEnabled ? 1 : 0); final DoubleVector4D position = new DoubleVector4D(x, y, z, 0); final DoubleVector4D rotation = new DoubleVector4D(0, 0, a, s); view = new View(status, position, rotation); } } else { final RenderingFormulaExtensionConfig formulaConfig = getRenderingFormulaExtensionConfig(); if (formulaConfig != null) { final DoubleVector2D scale = formulaConfig.getScale(); x = x - (z * scale.getX()) * ((Math.cos(a) * (zoom.lastX - zoom.startX)) + (Math.sin(a) * (zoom.lastY - zoom.startY))); y = y - (z * scale.getY()) * ((Math.cos(a) * (zoom.lastY - zoom.startY)) - (Math.sin(a) * (zoom.lastX - zoom.startX))); final IntegerVector4D status = new IntegerVector4D(0, 0, zoom.zoomEnabled || zoom.rotationEnabled ? 1 : 0, zoom.shiftEnabled ? 1 : 0); final DoubleVector4D position = new DoubleVector4D(x, y, z, 0); final DoubleVector4D rotation = new DoubleVector4D(0, 0, a, s); view = new View(status, position, rotation); } } } else { final IntegerVector4D status = new IntegerVector4D(0, 0, zoom.zoomEnabled || zoom.rotationEnabled ? 1 : 0, zoom.shiftEnabled ? 1 : 0); final DoubleVector4D position = new DoubleVector4D(x, y, z, 0); final DoubleVector4D rotation = new DoubleVector4D(0, 0, a, s); view = new View(status, position, rotation); } getAdapterContext().getConfig().getContext().updateTimestamp(); viewElement.setValue(view); } } /** * @see net.sf.jame.mandelbrot.MandelbrotZoomHandler#getWidth() */ public int getWidth() { return getSizeX(); } /** * @see net.sf.jame.mandelbrot.MandelbrotZoomHandler#getHeight() */ public int getHeight() { return getSizeY(); } } }