jdk/test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/spinner/MandelbrotControl.java
author mrkam
Wed, 30 Mar 2016 19:05:58 -0700
changeset 36744 a00905527ec2
permissions -rw-r--r--
8153141: Develop initial set of tests for SwingSet Reviewed-by: prr

/*
 * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code 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
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */
package com.sun.swingset3.demos.spinner;

import javax.swing.*;
import java.awt.*;
import java.awt.geom.Point2D;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeEvent;

import com.sun.swingset3.demos.ResourceManager;

/**
 * @author Mikhail Lapshin
 */
public class MandelbrotControl extends JPanel {

    private final JMandelbrot mandelbrot;
    private JSpinner iterSpinner;
    private CoordSpinner xSpinner;
    private CoordSpinner ySpinner;
    private static final double COORD_SPINNER_STEP = 0.1d; // part of width or height
    private final ResourceManager resourceManager;

    public MandelbrotControl(JMandelbrot mandelbrot,
            ResourceManager resourceManager) {
        this.mandelbrot = mandelbrot;
        this.resourceManager = resourceManager;
        createUI();
        installListeners();
    }

    private void createUI() {
        setLayout(new FlowLayout(FlowLayout.LEADING, 5, 0));
        setBorder(BorderFactory.createTitledBorder(
                resourceManager.getString("SpinnerDemo.fractalControls")));
        JSpinnerPanel spinnerPanel = new JSpinnerPanel();

        //<snip>Create spinner
        iterSpinner = new JSpinner(new SpinnerNumberModel(
                mandelbrot.getMaxIteration(), 10, 100000, 50));
        //</snip>
        //<snip>Add change listener using anonymus inner class
        iterSpinner.addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                mandelbrot.setMaxIteration((Integer) iterSpinner.getValue());
                mandelbrot.calculatePicture();
            }
        });
        //</snip>
        spinnerPanel.addSpinner(
                resourceManager.getString("SpinnerDemo.iterations"), iterSpinner);

        //<snip>Create spinner
        final double xValue = mandelbrot.getCenter().getX();
        double width = mandelbrot.getXHighLimit() - mandelbrot.getXLowLimit();
        xSpinner = new CoordSpinner(xValue, width * COORD_SPINNER_STEP);
        //</snip>
        //<snip>Add change listener using anonymus inner class
        xSpinner.addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                Double newX = (Double) xSpinner.getValue();
                mandelbrot.setCenter(new Point2D.Double(
                        newX, mandelbrot.getCenter().getY()));
                mandelbrot.calculatePicture();
            }
        });
        //</snip>
        spinnerPanel.addSpinner(
                resourceManager.getString("SpinnerDemo.x"), xSpinner);

        //<snip>Create spinner
        final double yValue = mandelbrot.getCenter().getY();
        double height = mandelbrot.getYHighLimit() - mandelbrot.getYLowLimit();
        ySpinner = new CoordSpinner(yValue, height * COORD_SPINNER_STEP);
        //</snip>
        //<snip>Add change listener using anonymus inner class
        ySpinner.addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                Double newY = (Double) ySpinner.getValue();
                mandelbrot.setCenter(new Point2D.Double(
                        mandelbrot.getCenter().getX(), newY));
                mandelbrot.calculatePicture();
            }
        });
        //</snip>
        spinnerPanel.addSpinner(
                resourceManager.getString("SpinnerDemo.y"), ySpinner);

        add(spinnerPanel);
    }

    private void installListeners() {
        mandelbrot.addPropertyChangeListener(
                JMandelbrot.CENTER_PROPERTY_NAME,
                new PropertyChangeListener() {
            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                double width = mandelbrot.getXHighLimit()
                        - mandelbrot.getXLowLimit();
                double newX = mandelbrot.getCenter().getX();
                xSpinner.updateModel(newX, width * COORD_SPINNER_STEP);
                double height = mandelbrot.getYHighLimit()
                        - mandelbrot.getYLowLimit();
                double newY = mandelbrot.getCenter().getY();
                ySpinner.updateModel(newY, height * COORD_SPINNER_STEP);
            }
        }
        );
    }

    //<snip>Customized spinner class
    // It uses special format for NumberEditor and has constant preferred width
    private static class CoordSpinner extends JSpinner {

        @Override
        protected JComponent createEditor(SpinnerModel model) {
            return new NumberEditor(this, "#.####################");
        }

        public CoordSpinner(double value, double stepSize) {
            super(new SpinnerNumberModel(value, -100, 100, stepSize));
        }

        //A useful shortcut method
        public void updateModel(double value, double stepSize) {
            SpinnerNumberModel model = (SpinnerNumberModel) getModel();
            model.setValue(value);
            model.setStepSize(stepSize);
        }

        @Override
        public Dimension getPreferredSize() {
            Dimension prefSize = super.getPreferredSize();
            prefSize.setSize(180, prefSize.getHeight());
            return prefSize;
        }
    }
    //</snip>
}