/*******************************************************************************
* Copyright (c) 2013, Daniel Murphy All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met: * Redistributions of source code must retain the
* above copyright notice, this list of conditions and the following disclaimer. * Redistributions
* in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
******************************************************************************/
package org.jbox2d.testbed.framework.javafx;
import org.jbox2d.testbed.framework.AbstractTestbedController;
import org.jbox2d.testbed.framework.TestbedModel;
import org.jbox2d.testbed.framework.TestbedPanel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.geometry.Bounds;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.input.MouseButton;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
/**
* @author Daniel Murphy
*/
@SuppressWarnings("serial")
public class TestPanelJavaFX extends Canvas implements TestbedPanel {
private static final Logger log = LoggerFactory.getLogger(TestPanelJavaFX.class);
public static final int SCREEN_DRAG_BUTTON = MouseButton.SECONDARY.ordinal();
public static final int INIT_WIDTH = 600;
public static final int INIT_HEIGHT = 600;
private final AbstractTestbedController controller;
public TestPanelJavaFX(final TestbedModel model, final AbstractTestbedController controller) {
super(INIT_WIDTH, INIT_HEIGHT);
this.controller = controller;
updateSize(INIT_WIDTH, INIT_HEIGHT);
JavaFXPanelHelper.addHelpAndPanelListeners(this, model, controller, SCREEN_DRAG_BUTTON);
ChangeListener<Number> sizeListener = (prop, oldValue, newValue) -> {
updateSize(getWidth(), getHeight());
};
widthProperty().addListener(sizeListener);
heightProperty().addListener(sizeListener);
getGraphicsContext2D().setFont(new Font("Courier New", 12));
}
@Override
public double maxWidth(double height) {
return Double.MAX_VALUE;
}
@Override
public double maxHeight(double width) {
return Double.MAX_VALUE;
}
public GraphicsContext getDBGraphics() {
return getGraphicsContext2D();
}
private void updateSize(double width, double height) {
controller.updateExtents((float) width / 2, (float) height / 2);
}
public boolean render() {
GraphicsContext dbg = getDBGraphics();
dbg.setFill(Color.BLACK);
Bounds bounds = getBoundsInLocal();
dbg.fillRect(bounds.getMinX(), bounds.getMinX(), bounds.getWidth(), bounds.getHeight());
return true;
}
public void paintScreen() {}
@Override
public void grabFocus() {
Platform.runLater(this::requestFocus);
}
}