/* * Copyright (c) 2015 Camil Staps */ package com.camilstaps.mandelbrot; import java.awt.Color; import java.awt.Graphics; import java.awt.event.InputEvent; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import javax.swing.JFrame; /** * * @author camilstaps */ public class ZoomFrame extends JFrame implements MouseListener, MouseMotionListener { private MandelbrotController mandelbrotController; private MandelbrotTextFields mandelbrotTextFields; private Graphics graphics; private int start_x, start_y, old_x, old_y; public ZoomFrame(String s) { super(s); addMouseListener(this); addMouseMotionListener(this); } public void setMandelbrotController(MandelbrotController mc) { mandelbrotController = mc; } public void setMandelbrotTextFields(MandelbrotTextFields mtf) { mandelbrotTextFields = mtf; } @Override public void mouseClicked(MouseEvent me) { } @Override public void mousePressed(MouseEvent me) { old_x = start_x = me.getX(); old_y = start_y = me.getY(); } @Override public void mouseReleased(MouseEvent me) { if (me.getX() == start_x && me.getY() == start_y) { if (mandelbrotController == null || mandelbrotTextFields == null) return; mandelbrotTextFields.setCenterX(mandelbrotController.getX(me.getX())); mandelbrotTextFields.setCenterY(mandelbrotController.getY(me.getY())); if ((me.getModifiers() & InputEvent.SHIFT_MASK) != 0) { mandelbrotTextFields.setScale(mandelbrotTextFields.getScale() / 2); } else { mandelbrotTextFields.setScale(mandelbrotTextFields.getScale() * 2); } } else { double center_x = (mandelbrotController.getX(me.getX()) - mandelbrotController.getX(start_x)) / 2 + mandelbrotController.getX(start_x); double center_y = (mandelbrotController.getY(me.getY()) - mandelbrotController.getY(start_y)) / 2 + mandelbrotController.getY(start_y); mandelbrotTextFields.setCenterX(center_x); mandelbrotTextFields.setCenterY(center_y); double scale = mandelbrotTextFields.getScale() / (me.getX() - start_x) * getWidth(); System.err.println(mandelbrotTextFields.getScale()); System.err.println(me.getX() - start_x); System.err.println(getWidth()); mandelbrotTextFields.setScale(scale); } mandelbrotController.redraw(); } @Override public void mouseEntered(MouseEvent me) { } @Override public void mouseExited(MouseEvent me) { } @Override public void mouseDragged(MouseEvent me) { Graphics g = getSafeGraphics(); if (g != null) { eraseZoombox(); g.drawRect(start_x, start_y, me.getX() - start_x, me.getX() - start_x); old_y = old_x = me.getX(); } } private Graphics getSafeGraphics() { if (graphics == null) { graphics = getGraphics(); graphics.setXORMode(Color.white); } return graphics; } private void eraseZoombox() { Graphics g = getSafeGraphics(); if (g != null) g.drawRect(start_x, start_y, old_x - start_x, old_y - start_x); } @Override public void mouseMoved(MouseEvent me) { //System.err.println(me.toString()); } public interface MandelbrotTextFields { public void setCenterX(double x); public void setCenterY(double y); public double getScale(); public void setScale(double scale); public void setRepetitions(double repetitions); } }